Hallo,
habe den Fehler endlich gefunden, warum keine Antwort kommt wenn als Datenwert (empfDaten.data) eine 235 übertragen wird. Datenpaket sieht dann so: 204,3,0,235,0,0,0,53,204,238
Mein STX Startcode 204 kommt dummwerweise im 16Bit CRC (53,204) nochmal vor. Weshalb das einlesen beim Empfänger fehl schlägt.
Wie löst man das Problem am dümmsten? Egal was ich für einen Start und Ende Erkennungscode verwende, er kann irgendwann in der Prüfsumme auftauchen und versaut alles.
Baut man noch eine zusätzliche Indexabfrage ein? Oder ... ?
const uint8_t STX = '\xCC'; // Startkennzeichen 204 der Nachricht
const uint8_t ETX = '\xEE'; // Endkennzeichen 238 der Nachricht
const uint8_t MasterAddr = 0; // # Adresse vom Master
const uint8_t myAddr = 3; // # meine Slave Adresse
union Nachricht
{
struct
{
uint8_t toAddr;
uint8_t fromAddr;
int32_t data;
uint16_t crc;
};
uint8_t asArray[8]; // Summe aller struct Datentypen, für Zugriff über Index
} empfDaten, sendDaten; // zwei gleiche union Buffer anlegen
bool read_Ringbuffer_0()
{
static uint8_t index = 0;
static bool state_Read = false;
static bool state_Complete = false;
uint16_t c = uart0_getc(); // nächstes Zeichen vom Ringbuffer holen
// UART Lib Fehlercodes (dezimal)
// 4096 2048 1024 512 256
// UART_FRAME_ERROR, UART_OVERRUN_ERROR, UART_PARITY_ERROR, UART_BUFFER_OVERFLOW, UART_NO_DATA
if ( c & UART_NO_DATA) {
return false; // Abbruch nach 500ns, es gibt nichts zum lesen
}
if ( c > UART_NO_DATA) { // irgendein UART Error
state_UART_MODE = ERROR; // Status ändern zur weiteren Fehlerbehandlung
index = 0;
state_Read = false;
state_Complete = false;
return false; // es gibt nichts zum lesen
}
// ------------------------------------------------------------------
c = (uint8_t)c; // Low Byte zur Weiterverarbeitung
if (c == ETX) { // Ende-Kennung ?
state_Read = false;
state_Complete = true;
}
if (state_Read == true && (index < sizeof(Nachricht))) { // Bytes einsortieren
empfDaten.asArray[index++] = c;
}
if (c == STX) { // Start-Kennung ?
index = 0;
state_Read = true;
state_Complete = false;
}
if (state_Complete == true && index >= (sizeof(Nachricht)) ) { // Übertragungsende
state_Complete = false;
index = 0;
if ( calc_CRC16(empfDaten.asArray, sizeof(Nachricht)) == 0) { // Checksumme korrekt ?
if (empfDaten.toAddr == myAddr) { // bin ich gemeint?
return true;
}
}
}
return false; // noch nicht fertig oder Checksumme falsch
}
