Raspberry Pi - UART - Framing error

Gast #3979565
Lesenswert?
• ▲
▼
Hallo,

ich möchte beim Raspberry Pi (Modell B v2.0) die UART in einem 
C-Programm konfigurieren und auslesen. Ich verwende dazu die Funktionen 
aus termios.h.

Mein Problem:
Ich möchte die UART so konfigurieren, dass weder Paritätsfehler noch die 
BREAK-Kondition berücksichtig werden, sondern ausschließlich framing 
errors (fehlendes Stoppbit) mit der Sequenz '\377' '\0' signalisiert 
werden.

Hier ein Auszug aus meiner Konfiguration:
1
cfsetispeed(&rpiOpt, B9600); // set baud rate line in
2
cfsetospeed(&rpiOpt, B9600); // set baud rate line out
3

4
rpiOpt.c_cflag &= ~PARENB;   // no parity bit
5
rpiOpt.c_cflag &= ~CSTOPB;   // 1 stop bit
6
rpiOpt.c_cflag &= ~CSIZE;    // 8 data bits
7
rpiOpt.c_cflag |= CS8;
8
rpiOpt.c_cflag |= CLOCAL;        
9
rpiOpt.c_cflag |= CREAD;     // allow read access
10

11
rpiOpt.c_lflag &= ~ICANON;   // non-canonical mode (raw mode)
12
rpiOpt.c_lflag &= ~(ECHO | ECHOE); // no echo
13
rpiOpt.c_lflag &= ~ISIG;     // no interrupts
14
    
15
rpiOpt.c_iflag &= ~IGNPAR;   // do not ignore input framing/parity errors
16
rpiOpt.c_iflag &= ~INPCK;    // disable input parity checking
17
rpiOpt.c_iflag |= PARMRK;    // mark framing/parity errors
18
rpiOpt.c_iflag |= IGNBRK;    // ignore BREAK
19
    
20
rpiOpt.c_oflag &= ~OPOST;    // raw output
21
  
22
rpiOpt.c_cc[VMIN] = 0;       // wait for at least 0 chars
23
rpiOpt.c_cc[VTIME] = 10;     // timeout 1 second
24

25
tcflush(rpiFd, TCIOFLUSH);
26
    
27
tcsetattr(rpiFd, TCSAFLUSH, &rpiOpt);

Der Zeichenempfang funktioniert soweit. Doch leider werden keine framing 
errors markiert - obwohl definitiv vorhanden!

Wie muss ich die Konfig. abhändern? Ist das gewünschte Verhalten über 
termios.h überhaupt möglich?

Vielen Dank im Voraus!

Gruß,
Matthias
Gast #3979605
Lesenswert?
• ▲
▼
Wenn ich es richtig verstanden habe, sind die Paritätsprüfung und der 
Framecheck unabhängig. Das eine prüft, ob das Paritätsbit zu den 
Datenbits passt, das andere, ob das Stoppbit zum erwarteten Zeitpunkt 
eintrifft.

Die Nachrichten, die ich empfange, haben KEIN Paritätsbit, daher soll 
die Paritätsprüfung auch deaktiviert werden. Trotzdem sollen framing 
errors erkannt werden, also die Tatsache, dass das Stoppbit fehlt.

Den Raw-Mode habe ich gewählt, weil ich in jedem Fall ALLE Bytes 
empfangen möchte, egal ob mit oder ohne framing error. Ich möchte nur 
informiert werden, falls ein framing error aufgetreten ist oder nicht.
Gast #3979631
Lesenswert?
• ▲
▼
Matthias schrieb:
> Den Raw-Mode habe ich gewählt, weil ich in jedem Fall ALLE Bytes
> empfangen möchte,

Framing errors can be detected with parity bits.

Jedoch sollte man, wenn man eine wirklich sichere Übertragung 
sicherstellen will ein Transportprotokoll implementieren.
Dazu eignet sich bspw. schon ein CRC-Check. Hier gut beschrieben: 
http://www.lammertbies.nl/comm/info/crc-calculation.html

Früher setzte man oft STX/ETX Protokoll ein.
Ein zu übertragender Datenblock wurde wie folgt eingerahmt:
STX Daten ETX BCC

BCC = BlockCheckCharacter (ist ein Bytewert des X-OR über alle Daten)
Besser ist ein CRC-16 oder CRC-32 anstelle des BCC.
Kann leicht über Tabellen generiert werden.

Damit kann der Empfänger prüfen, ob der Datenblock ok ist oder nicht.
Im negativen Fall sendet er ein NAK und im positiven Fall ein ACK an den 
Sender.
Nachdem der Sender ein NAK erhalten hat, wiederholt er den Block.
Beim ACK geht es mit dem nächsten Block weiter.

Ergo: Wenn die Datenübertragung gesichert sein soll, kommt man um ein 
minimales Protokoll nicht herum.

Weitere, höhere,Übertragungsprotokolle sind bspw.: HDLC/SDLC, LSV1, 
MSV1, usw.
Google mal danach.
Gast #3979747
Lesenswert?
• ▲
▼
Danke für die Info, aber mir geht es nicht darum eine sichere, robuste 
Übertragung zu implementieren. Mich interessieren ausschließlich die 
fehlenden Stoppbits, da die Kommunikation mit 8N1 läuft und daher 
ohnehin keine Paritätsbits enthält.

Irgendwie muss ich doch das FE (framing error) Bit, NICHT das PE (parity 
error) Bit!, von der Raspberry Pi Uart alleine auswerten können!?

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.