usart Übertragung/ Endzeichen

Gast #5359640
Lesenswert?

allgemeine Frage zur Übertragung von Daten:

Ich will Daten zwischen PC und m328/ch340 per usb/usart austauschen. 
I2c-Bausteine sollen mittels m328 vom PC aus beschrieben und ausgelesen 
werden.

Gesendet wird byteweise, also Werte von 0 bis 255. Wie wird dem 
Gegenpart am Besten mitgeteilt, dass der Datensatz zu Ende ist?

Wenn ich ein Endzeichen abfrage
    if(rxBuffer[rxWritePos]!=10)...
reduziert sich die Datenübertragung von 8bit auf 4bit weil ich zur 
Darstellung von 255 Zeichen das Endzeichen nicht benutzen kann.

Wie macht man es am Besten:
-timeout
-Endzeichen
-definierte Datensatzlänge
???

Gibts was brauchbares Fertiges?
Gast #5359665
Lesenswert?

Wenn du Binär übertragen willst, brauchst du ein Protokoll:

START Bedinung
Typ der Daten
Länge in Bytes
Daten


Wenn du ASCII oder BASE68 codiert überträgst kannst Zeilenumbrüche oder 
änliches verwenden
Gast #5359798
Lesenswert?

Je nach Empfindlichkeit der Verkabelung und Wert auf Integrität der 
Daten würde ich noch eine CRC16 Checksumme an den Datenblock anhängen, 
damit die korrekte Übertragung sichergestellt ist...
Gast #5360973
Lesenswert?

Reiner_Gast schrieb:
> CRC16 Checksumme

Ich hab eine sehr vereinfachte crc-Prüfung:
1
ISR(USART_RX_vect)
2
{
3
u8 i=0;
4
    led1_on;
5
    rxBuffer[rxWritePos] = UDR0;
6
    if(rxBuffer[rxWritePos]!=10){
7
      crc=crc+1+rxBuffer[rxWritePos];
8
      rxWritePos++;
9
    }else{
10
    
11
    //Übertragung beendet
12
    rxWritePos=0;
13
    twx_rx_auswerten();
14
    led1_off;
15
    }
16
    
17
}

Macht es Sinn auf crc8 oder crc16 umzustellen?

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren