Basteln mit Arduino / USB und CRC

pvbrowser

Level-1
Beiträge
470
Reaktionspunkte
44
Zuviel Werbung?
-> Hier kostenlos registrieren
Bei USB werden die übertragenen Daten ja schon über CRC gesichert.
Siehe:
http://www.beyondlogic.org/usbnutshell/usb3.shtml

Jetzt habe ich mal mit einem Arduino Nano gebastelt und
den Arduino über USB mit einem Notebook verbunden.
Dabei erscheint die USB Schnittstelle als /dev/ttyUSBx auf dem Notebook.

Die einfachste Kommunikation zwischen dem Arduino und der Notebook ist jetzt
einfaches ASCII Protokoll.
Beide Seiten können jeder Zeit eine Zeile Text, mit "0x0d 0x0a" abgeschlossen, an die Gegenseite senden.
Dieser Text wird dann dort interpretiert.

Frage:
Wie seht Ihr das,
werden damit die Daten "sicher" übertragen oder
würde man so etwas wie Modbus RTU benötigen,
damit die CRC Summen für industrielle Anwendungen OK wären?
 
Was bei dir aktuell eine CRC hat, ist die Verbindung auf USB-"Layer".
Das ist der Teil, den der Nano nutzt um seinen Virtuellen Com-Port an dein Noti zu docken...

Es schützt aber leider nicht deine übertragenen Daten auf dem Com-Port.

Hier musst du dann eben ein Protokoll einsetzen, welches das kann.
Wenn du aber schon mal ASCII nutzt, wäre Modbus-ASCII vielleicht leichter implementierbar. Denn sonst musst du auf dem Nano ja alles erst mal in Byte-Code und auf dem Noti wieder zurück wandeln :)
Dazu kommt dann natürlich, das Beide Kommunikationsteilnehmer natürlich auch die CRC berechnen müssen...

MfG Fabsi
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Was bei dir aktuell eine CRC hat, ist die Verbindung auf USB-"Layer".

Ja, richtig das liegt auf OSI Ebene 2 "Data Link Layer".
Das ist vergleichbar mit TCP.
Bei TCP kann ich mich auf Transport Ebene (socket) darauf verlassen, dass die Daten korrekt übertragen wurden.
Auf Anwendungsebene brauche ich dort dann auch kein CRC mehr.

Wenn ich bei der USB Verbindung mit dem Arduino den Stecker ziehe,
bekomme ich bei
ret = ::select(maxfdp1,&rset,&wset,&eset,&timout);
-1 zurückgeliefert.
"On error, -1 is returned, and errno is set to indicate the error; the file
descriptor sets are unmodified, and timeout becomes undefined."
Bei einem folgenden
ret = read(fd,buf,1);
wird 0 zurückgeliefert.
"On success, the number of bytes read is returned (zero indicates end of file)..."

Das Ein-/Ausstöpseln des USB Steckers wird also schon mal sicher erkannt.
Ich gehe nun davon aus, dass wenn bei der Datenübertragung ein Bit kippt,
das USB CRC das erkennt und bei select()/read() Fehler zurückgemeldet werden.

Eine einfache ASCII Kommunikation über diese USB Verbindung müsste also "gesichert" sein.

PS: Modbus zu implementieren wäre übrigens kein Problem.
 
Nachtrag:

Bei der Verbindung
Notebook <---> Arduino
ist physikalisch ja NUR USB im Spiel.
Nur das Betriebssystem stellt das dem Anwenderprogramm als serielle Schnittstelle zur Verfügung.

Anders würde es aussehen, wenn man einen USB/Seriell Konverter mit drin hätte.
Dann hätte man wirklich ein Stück "Strippe" mit V24 Level.
 
Zurück
Oben