Es gibt viele Möglichkeiten, ein serielles Protokoll zu schreiben, je nachdem, welche Funktionalität Sie wünschen und wie viel Fehlerprüfung Sie benötigen.
Einige der häufigsten Dinge, die Sie in Punkt-zu-Punkt-Protokollen sehen, sind:
Ende der Nachricht
Die einfachsten ASCII-Protokolle haben nur ein Ende der Nachrichtenzeichenfolge, häufig \r
oder \n
weil dies gedruckt wird, wenn die Eingabetaste gedrückt wird. Bei binären Protokollen wird möglicherweise 0x03
ein anderes gemeinsames Byte verwendet.
Beginn der Nachricht
Das Problem, nur das Ende der Nachricht zu haben, ist, dass Sie nicht wissen, welche anderen Bytes bereits empfangen wurden, wenn Sie Ihre Nachricht senden. Diese Bytes würden dann der Nachricht vorangestellt und dazu führen, dass sie falsch interpretiert wird. Wenn der Arduino beispielsweise gerade aus dem Ruhezustand erwacht ist, befindet sich möglicherweise etwas Müll im seriellen Puffer. Um dies zu umgehen, haben Sie einen Start der Meldungssequenz. In Ihrem Beispiel ^
häufig in binären Protokollen0x02
Fehlerüberprüfung
Wenn die Nachricht beschädigt werden kann, müssen wir einige Fehler überprüfen. Dies kann eine Prüfsumme oder ein CRC-Fehler oder etwas anderes sein.
Escape-Charaktere
Möglicherweise wird durch die Prüfsumme ein Steuerzeichen hinzugefügt, z. B. das Byte "Beginn der Nachricht" oder "Ende der Nachricht", oder die Nachricht enthält einen Wert, der einem Steuerzeichen entspricht. Die Lösung besteht darin, ein Escape-Zeichen einzuführen. Das Escape-Zeichen wird vor einem geänderten Steuerzeichen platziert, sodass das tatsächliche Steuerzeichen nicht vorhanden ist. Wenn beispielsweise ein Startzeichen 0x02 ist, können wir mit dem Escape-Zeichen 0x10 den Wert 0x02 in der Nachricht als Bytepaar 0x10 0x12 (Byte-XOR-Steuerzeichen) senden.
Paketnummer
Wenn eine Nachricht beschädigt ist, können wir ein erneutes Senden mit einer Nack- oder Retry-Nachricht anfordern. Wenn jedoch mehrere Nachrichten gesendet wurden, kann nur die letzte Nachricht erneut gesendet werden. Stattdessen kann dem Paket eine Nummer zugewiesen werden, die sich nach einer bestimmten Anzahl von Nachrichten überschlägt. Wenn diese Nummer beispielsweise 16 ist, kann das sendende Gerät die letzten 16 gesendeten Nachrichten speichern. Wenn eine Nachricht beschädigt ist, kann das empfangende Gerät unter Verwendung der Paketnummer ein erneutes Senden anfordern.
Länge
In binären Protokollen wird häufig ein Längenbyte angezeigt, das dem empfangenden Gerät angibt, wie viele Zeichen in der Nachricht enthalten sind. Dies fügt eine weitere Ebene der Fehlerprüfung hinzu, als ob die richtige Anzahl von Bytes nicht empfangen worden wäre, als ob ein Fehler aufgetreten wäre.
Arduino-spezifisch
Bei der Ausarbeitung eines Protokolls für Arduino ist die erste Überlegung, wie zuverlässig der Kommunikationskanal ist. Wenn Sie über die meisten Funkmedien, XBee, WiFi usw. senden, sind bereits Fehlerüberprüfungen und Wiederholungsversuche eingebaut, und es macht keinen Sinn, diese in Ihr Protokoll aufzunehmen. Wenn Sie einige Kilometer über RS422 senden, ist dies erforderlich. Die Dinge, die ich einschließen würde, sind der Beginn der Nachricht und das Ende der Nachricht Zeichen, wie Sie haben. Meine typische Implementierung sieht ungefähr so aus:
>messageType,data1,data2,…,dataN\n
Die Begrenzung der Datenteile durch ein Komma ermöglicht ein einfaches Parsen, und die Nachricht wird unter Verwendung von ASCII gesendet. ASCII-Protokolle eignen sich hervorragend, da Sie Nachrichten in den seriellen Monitor eingeben können.
Wenn Sie ein binäres Protokoll wünschen, um möglicherweise die Nachrichtengrößen zu verkürzen, müssen Sie ein Escape-Verfahren implementieren, wenn ein Datenbyte mit einem Steuerbyte identisch sein kann. Binäre Steuerzeichen sind besser für Systeme, bei denen das gesamte Spektrum der Fehlerüberprüfung und -wiederholung gewünscht wird. Falls gewünscht, kann die Nutzlast weiterhin ASCII sein.