Guten Morgen,
es ist mal wieder Brett-vorm-Kopf Zeit. Ich gucke jetzt eine halbe
Stunden auf meinen Quellcode und verstehe gerade die Welt nicht mehr.
Der Fehler muss dermaßen dämlich sein, dass ich nicht drauf komme, was
ich falsch mache. Vielleicht hat ja jemand von euch gerade den richtigen
Druchblick, aber der Reihe nach. Ich habe einen Ringbuffer, in den ich
Daten schreibe. Dazu einen ByteCount wie voll der Buffer ist. Daten
werden per UART in den Buffer geschrieben und wenn ich CR/LF Empfangen
habe, soll die Nachricht verarbeitet werden. Oder momentan zum Debuggen
nur wieder ausgegeben. Klappt auch alles, bis auf ein paar Sonderfälle,
die Systembedingt sind. Für die muss ich jetzt passende Workarrounds
bauen. Einer dieser Workarrounds ist die Abfrage, dass nicht nur die
Nachricht korrekt Empfangen wurde, was ja durch CR/LF erreicht wird,
sonder dass auch wirklich Daten im Puffer sind. Könnte ja jemand nur
CR/LF senden.
1 | while (1)
|
2 | {
|
3 | if(MessageComplete && Buffer.ByteCount) //Received CR or RX Buffer is full and there is data in the buffer without triggering the watch dog timer
|
4 | {
|
5 | switch (RingBuffer_Read(&Buffer)) //Use first byte of RingBuffer to identify commando message
|
6 | {
|
7 | case 'A': //65 = Ascii A
|
8 | while(Buffer.ByteCount) //As long as the message was
|
9 | {
|
10 | while(!(USARTC0.STATUS & USART_DREIF_bm)); //Check that transmission buffer is empty
|
11 | USARTC0.DATA = RingBuffer_Read(&Buffer); //Send out single byte of message
|
12 | }
|
13 | break;
|
14 | case 'M': //77 = Ascii M
|
15 | BSMeasResult = PerformMeasurement(); //Do a single Basestation measurement
|
16 | while(!(USARTC0.STATUS & USART_DREIF_bm)); //Check that UART Tx is ready
|
17 | USARTC0.DATA = BSMeasResult; //Transmit Basestation measurement result to Matlab
|
18 | break;
|
19 | default:
|
20 | /* code */
|
21 | break;
|
22 | }
|
23 |
|
24 | MessageComplete = 0; //Command message was completely processed
|
25 | }
|
26 | }
|
Also Prüfung auf MessageComplete && Buffer.ByteCount. Im Debugger sehe
ich, dass beide Werte ungleich 0 sind. Was meine Erwartungshaltung ist,
nur wird die Abfrage nie wahr. Das Programm steht an der Stelle. Nehme
ich die Abfrage auf ByteCount raus, klappt die If-Abfrage auf
MessageComplete. Die nachfolgende While Schleife wird auch brav
abgearbeitet. Buffer_Read zählt den ByteCount runter, die Ausgabe passt.
Wie kann es also sein, dass das alles Funktioniert, die vermalledeite
if-Abfrage aber nie Erfüllt wird?
Gruß und Danke,
Thomas