Ich habe gerade ein Projekt gestartet, wo ich seit Tagen über serielle Ports kämpfen. Ich habe eine statische Bibliothek geschrieben, die die gesamte serielle Routine verarbeiten kann und eine Schnittstelle mit den Funktionen "readLine()" und "writeLine()" bietet. Alles funktioniert einwandfrei beim Schreiben und Lesen (die übrigens weggefädelt sind) außer wenn der Slave nicht anwser wird, nachdem er die Daten bekommen hat, dann werden die Daten an mich zurückgeschickt, und ich lese es.Lesen am seriellen Port gibt zurück, was ich gerade geschrieben habe
Ich öffne meine fd mit O_NDELAY und konfigurieren Sie meinen Lese-Systemaufruf als Non-Blocking mit fcntl.
Hier sind die zwei Gewinde-Schleifen, die perfekt dazu funktionieren.
void *Serial_Port::readLoop(void *param)
{
Serial_Port *sp = static_cast<Serial_Port*>(param);
std::string *line = NULL;
char buffer[128];
while (1)
{
line = new std::string();
while ((line->find("\r\n")) == std::string::npos)
{
usleep(100);
bzero(buffer, 128);
pthread_mutex_lock(sp->getRLock());
if (read(sp->getDescriptor(), buffer, 127) > 0)
*line += buffer;
pthread_mutex_unlock(sp->getRLock());
}
pthread_mutex_lock(sp->getRLock());
sp->getRStack()->push(line->substr(0, line->find("\r\n")));
pthread_mutex_unlock(sp->getRLock());
delete (line);
}
return (param);
}
void *Serial_Port::writeLoop(void *param)
{
Serial_Port *sp = static_cast<Serial_Port*>(param);
std::string *line;
while (1)
{
line = NULL;
pthread_mutex_lock(sp->getWLock());
if (!sp->getWStack()->empty())
{
line = new std::string(sp->getWStack()->front());
sp->getWStack()->pop();
}
pthread_mutex_unlock(sp->getWLock());
if (line != NULL)
{
pthread_mutex_lock(sp->getWLock());
write(sp->getDescriptor(), line->c_str(), line->length());
// fsync(sp->getDescriptor());
pthread_mutex_unlock(sp->getWLock());
}
usleep(100);
}
return (param);
}
Ich habe versucht, den Dateideskriptor zu spülen, aber ich kann keine Daten nach tun, dass erhalten verwalten. Wie kann ich diese doppelten, unnötigen Daten loswerden?
Danke.
Haben Sie das lokale Echo deaktiviert? * "konfiguriere meinen Lese-System-Anruf als nicht blockierend" * - Wahrscheinlich eine schlechte Idee, da du scheinbar nur mehr CPU-Zyklen verschwendest und pollst. Um Zeilen von einem Terminal zu lesen, siehe http://stackoverflow.com/questions/36586137/stop-on-newline-when-using-read/36588517#36588517 – sawdust
Ich wurde gezwungen, lesen in nicht blockierenden Modus, wie es nicht würde Lassen Sie den Mutex los, solange nichts zu lesen war. Ich habe über keine andere Alternative nachgedacht – stalker2106