Hemi
25.05.2008, 16:17
Hallo zusammen,
ich habe ein kleines Problemchen, okay, es sind zwei in einem. O:)
Und zwar, habe ich einen UART-Ringpuffer:
#define UART_BUF_SIZE 128
char uart0_buffer[UART_BUF_SIZE];
unsigned char in0_ptr;
unsigned char out0_ptr;
Der Ringpuffer wird von den Funktion (bzw. Interrupt) befüllt:
ISR(USART0_RXC_vect) {
uart0_buffer[in0_ptr] = UDR0;
in0_ptr++;
if (in0_ptr == UART_BUF_SIZE){
in0_ptr = 0;
}
}
Soweit, so gut.
Nun habe ich folgendes Problem: Wie kriege ich das hin, dass ich im Ringpuffer suchen kann?
Angenommen, ich habe eine Nachricht, die so aussieht:
// Bremsbeläge
char brake_pads_msg[] PROGMEM = {0x02, 0x04, 0x01, 0xC8, 0x3E, 0xF1};
Wie kriege ich das hin, dass ich solche Nachrichten im Datenstrom finden kann?
Das war das erste Halbproblem.
Hier das zweite Halbproblem:
Angenommen, ich habe eine Teilnachricht, die ich im Datenstrom suchen will. Diese sieht dann so aus:
// Verbrauch1:
char consumption1_msg[] PROGMEM = {0x02, 0x05, 0x01, 0x92};
Hier ist es etwas schwieriger. Die zweite Stelle dieser Nachricht, also 0x05 gibt die Länge der Nachricht an. Der Punkt ist, dass die Nachricht an sich sich ändert, nur dieser Header ist immer gleich. Das würde bedeuten, dass ich nach diesem Header suchen muss, wenn ich den Header gefunden habe, muss ich die ganze Nachricht extrahieren und dann auswerten.
Hier ein Beispiel der vollständigen Nachricht:
0x02, 0x05, 0x01, 0x92, 0x95, 0x83, 0x82
0x02: Ist der Sender der Nachricht
0x05: Ist wie gesagt die Länge der Nachricht ab dem nächsten Byte
0x01: Ist der Empfänger
0x92: Nummer der Funktion (ist uninteressant für dieses Beispiel)
0x95 und 0x83 sind die Nutzdaten
0x82: XOR CRC
Die Länge wird ab dem dritten Byte bis CRC angegeben und sie ist wie gesagt immer gleich bei dieser Art der Nachrichten.
Vielen Dank im Voraus.
Achja, ganz vergessen, der Mikrocontroller ist ein AtMega162.
Grüsse
Heinrich
ich habe ein kleines Problemchen, okay, es sind zwei in einem. O:)
Und zwar, habe ich einen UART-Ringpuffer:
#define UART_BUF_SIZE 128
char uart0_buffer[UART_BUF_SIZE];
unsigned char in0_ptr;
unsigned char out0_ptr;
Der Ringpuffer wird von den Funktion (bzw. Interrupt) befüllt:
ISR(USART0_RXC_vect) {
uart0_buffer[in0_ptr] = UDR0;
in0_ptr++;
if (in0_ptr == UART_BUF_SIZE){
in0_ptr = 0;
}
}
Soweit, so gut.
Nun habe ich folgendes Problem: Wie kriege ich das hin, dass ich im Ringpuffer suchen kann?
Angenommen, ich habe eine Nachricht, die so aussieht:
// Bremsbeläge
char brake_pads_msg[] PROGMEM = {0x02, 0x04, 0x01, 0xC8, 0x3E, 0xF1};
Wie kriege ich das hin, dass ich solche Nachrichten im Datenstrom finden kann?
Das war das erste Halbproblem.
Hier das zweite Halbproblem:
Angenommen, ich habe eine Teilnachricht, die ich im Datenstrom suchen will. Diese sieht dann so aus:
// Verbrauch1:
char consumption1_msg[] PROGMEM = {0x02, 0x05, 0x01, 0x92};
Hier ist es etwas schwieriger. Die zweite Stelle dieser Nachricht, also 0x05 gibt die Länge der Nachricht an. Der Punkt ist, dass die Nachricht an sich sich ändert, nur dieser Header ist immer gleich. Das würde bedeuten, dass ich nach diesem Header suchen muss, wenn ich den Header gefunden habe, muss ich die ganze Nachricht extrahieren und dann auswerten.
Hier ein Beispiel der vollständigen Nachricht:
0x02, 0x05, 0x01, 0x92, 0x95, 0x83, 0x82
0x02: Ist der Sender der Nachricht
0x05: Ist wie gesagt die Länge der Nachricht ab dem nächsten Byte
0x01: Ist der Empfänger
0x92: Nummer der Funktion (ist uninteressant für dieses Beispiel)
0x95 und 0x83 sind die Nutzdaten
0x82: XOR CRC
Die Länge wird ab dem dritten Byte bis CRC angegeben und sie ist wie gesagt immer gleich bei dieser Art der Nachrichten.
Vielen Dank im Voraus.
Achja, ganz vergessen, der Mikrocontroller ist ein AtMega162.
Grüsse
Heinrich