2016-04-26 5 views
0

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.

+0

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

+0

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

Antwort

1

Nach mehreren Tests und Verhaltensanalyse entdeckte ich, dass es das "Pulsar3" war (das Gerät, das ich auf seriell verwendete), das mir zurückgab, was ich als "Bestätigung" sendete. Gut zu wissen!

+1

Dies ist sehr häufig in seriellen Geräten, die an eine CRT angeschlossen werden sollen. Die CRT zeigt per Konvention nicht, was Sie auf der Tastatur eingeben, es liegt also in der Verantwortung des Remote-Systems, es bei Ihnen wiederzugeben, damit Sie es sehen können. –

Verwandte Themen