Hallo,
ich bin derzeit am Basteln einer kleinen UART Kommunikationsroutine.
Ich weiß das Thema gibts schon und ich habe auch die Suchfunktion
bemüht, allerdings hab ich keinen Ansatz gefunden.
Ich nutze zum Senden der Daten von PC zu µC folgendes Protokoll:
STX|CMD|AL|A0|..|An|ETX
wobei AL die Länge des Attributs ist und A0..An die Attributdaten.
Gehandlet werden die Daten in einem struct das ich CtrlInterface genannt
hab. Darin befindet sich ein State und ein FIFO Buffer für die
empfangenen Daten.
In der UART ISR setze ich mit STX/ETX den State auf "RECEIVE"/"COMPLETE"
daneben gibt es noch den "IDLE" state in dem auf den Beginn einer
Übertragung gewartet wird (wird gesetzt wenn ein Kommando abgearbeitet
wurde).
Die Daten möchte ich eigentlich binär übertragen und nicht in ASCII.
Durch die State Machine hab ich keine Probleme mit dem Wert 0x02 (STX).
0x03 (ETX) bereitet mir jedoch Probleme, da während des Empfangens einer
Übertragung keine Daten mit dem Wert 0x03 gesendet werden können, sonst
wird das natürlich als Ende der Übertragung angesehen.
1 |
|
2 | ISR(USART_RX_vect)
|
3 | {
|
4 | uint8_t uartRX = UDR0;
|
5 | switch(CtrlInterface.state)
|
6 | {
|
7 | case IDLE:
|
8 | // waiting for start of transmission
|
9 | if(uartRX == STX)
|
10 | CtrlInterface.state = RECEIVE;
|
11 | break;
|
12 | case COMPLETE:
|
13 | // trunk data
|
14 | break;
|
15 | case RECEIVE:
|
16 | // receiving data
|
17 | if(uartRX == ETX)
|
18 | CtrlInterface.state = COMPLETE;
|
19 | else
|
20 | fifo_push(CtrlInterface.pUSART_RX_Buf, uartRX);
|
21 | }
|
22 | }
|
Eine Möglichkeit wäre natürlich das Zählen der empfangenen Attribut
Character. Das würde aber zu einem zusätzlichen Member in der
CtrlInterface Struktur führen und etwas mehr Arbeit in der ISR
verlangen. STX und ETX als Beginn und Ende einer Übertragung zu nutzen
erscheint mir daher sauberer, mir fällt nur nicht ein wie ich das oben
genannte Problem lösten könnte.
Nutzt man ETX nur wenn man Daten als ASCII Zeichen überträgt? Mir fällt
momentan leider kein anderer Weg ein...
Viele Grüße
Stefan