2017-12-02 5 views
-1

Linux Version: 4.9.59Linux Serial Port RAW-Modus

Plattform: Raspberry Pi 3 Modell B

USB-Seriell: FTDI4232

Ich möchte einen großen Teil der Daten von einer Maschine gelesen (ungefähr 4096 Bytes). Alle druckbaren Daten im ASCII-Format. Die Daten kommen kontinuierlich in einer Übertragung; sobald der Benutzer die Schaltfläche für die Datenübertragung gedrückt hat. Dieser Vorgang findet einmal in 30 Minuten statt. Die Daten enthalten mehrere CR LF.

Ich habe den seriellen Anschluss als RAW Input Mode konfiguriert.

config.c_lflag &= ~(ICANON | ISIG | ECHO | ECHOE); 
this->minChars = 5000; 
this->timeOut = 100000; 
if(this->timeOut > 0) 
    config.c_cc[VTIME] = this->timeOut; 
else 
    config.c_cc[VTIME] = 0; 

if(this->minChars > 0) 
    config.c_cc[VMIN] = this->minChars; 
else 
    config.c_cc[VMIN] = 0; 

Lesen Funktion:

ready = epoll_wait(this->epfd, &this->events, 1, this->ePollTimeout); 
returnVal = read(this->fd, readDataBuffer, 8192); 

Allerdings, wenn ich von der seriellen Schnittstelle gelesen das System bricht die eingehenden Blob in zu mehreren Paketen und einige der Pakete verloren gehen.

Eg. : Ich habe 278 Bytes an Daten gesendet. Das System brach dies in 3 Paketen zufälliger Länge. Die Paketlänge variiert jedes Mal mit der Ausführung. Bitte um Rat.

+0

Ihre Code-Schnipsel sind nicht ausreichend, um sicherzustellen, dass Sie wirklich Raw-Modus richtig konfiguriert haben. Auf der Hilfeseite: "Fragen, die Debugging-Hilfe suchen (" Warum funktioniert dieser Code nicht? ") Muss ... den kürzesten Code enthalten, der für die Reproduktion in der Frage selbst erforderlich ist. Siehe [Erstellen einer Minimal, Complete und Überprüfbares Beispiel] (https://stackoverflow.com/help/mcve). " Z.B. Ihre Verwendung von epoll_wait() legt nahe, dass Sie nicht blockierende Lesevorgänge verwenden, die sich wie beschrieben verhalten können. – sawdust

Antwort

0

read wird bis zu der Anzahl der von Ihnen angegebenen Bytes gelesen, aber es garantiert nicht, dass viele Bytes tatsächlich gelesen werden. Der Rückgabewert von read ist die Anzahl der tatsächlich gelesenen Bytes. In der Regel werden Lese-Syscalls in While-Schleifen platziert, bis die gewünschte Anzahl an Bytes tatsächlich gelesen wird, ein Fehler auftritt oder das Ende der Datei/des Datenstroms erreicht wird.

http://pubs.opengroup.org/onlinepubs/9699919799/functions/read.html

+0

Im RAW-Modus gemäß der Dokumentation lesen Sie entweder nach dem Empfang des ersten Zeichens oder nach der Mindestanzahl von Zeichen die Rückmeldung nach dem Timeout-Wert. Ich bin nicht in der Lage, die plötzliche Rückkehr des Systemanrufs zu erklären. –

+0

Nein, tut es nicht. Es gibt keine Zeitüberschreitung bei Ihrem Leseaufruf. Was ist der Rückgabewert von Lesen? – tweej

+0

@DarkSorrow * "Ich bin nicht in der Lage, die plötzliche Rückkehr des System-Leseaufrufs zu erklären." - Also Null-out der Timeout-Wert (d. H. VTIME), so dass es eine reine gezählte Lesung ist, und sehen, was passiert. Ich wäre nicht überrascht, wenn Sie die gleichen Ergebnisse (wegen der wahrscheinlich falschen Konfiguration) erhalten. – sawdust

Verwandte Themen