Forum: Mikrocontroller und Digitale Elektronik mehrere Zeichen per UART empfangen


von Tobias L. (tobias_l477)


Angehängte Dateien:

Lesenswert?

Hallo zusammen
ich bin gerade ein wenig am verzweifeln...
ich habe eine ESP32 BT-Modul über die UART an einen Atmega88 
angeschlossen....
Ich möchte das BT-Modul als Gateway nutzen.
das heisst das BT Modul soll Daten per bluetooth empfangen und weiter an 
den Atmega88 schicken...

Ich kann aber leider NUR EIN ZEICHEN  empfangen
das heisst ich komme in die beiden IF Zweige (das sehe ich da ich die 
LED per BT ein und ausschalten kann)
aber ich bekomme als response nicht die 0x55 zurück.... hat einer eine 
idee woran es liegen kann?
ich bin seit längere Zeit aus dem aktiven coden raus und will mich 
wieder einarbeiten

von Olli Z. (z80freak)


Lesenswert?

Das ist ein Timing-Problem.

Der ESP32 sendet receive_BT_Array[1] und receive_BT_Array[2] über UART:
1
cppSerial.write(receive_BT_Array[1]);  // 0x33
2
Serial.write(receive_BT_Array[2]);

Der ATmega empfängt das in fillReceiveBuffer():
1
while ((UCSR0A & (1<<RXC0)))  // ← Problem hier!
2
{
3
    receivebuffer[indexBuffer] = UART_Receive();
4
    indexBuffer++;
5
}

Die while-Bedingung (UCSR0A & (1<<RXC0)) prüft nur ob im Moment der 
Ausführung wenigstens ein Byte im Buffer liegt. Nach dem ersten Byte ist 
RXC0 dann kurz 0, bevor das zweite Byte ankommt – die Schleife bricht 
also zu früh ab.

UART_Receive() wartet zwar intern mit while (!(UCSR0A & (1<<RXC0))), 
aber die äußere while-Schleife prüft das Flag bevor das nächste Byte 
ankam.

Du musst Deinen Code umbauen, auf Timeoutgesteuerten Empfang. Oder 
besser gleich mit UART-Events. Bei UART ist es auch eine Protokollfrage, 
wann Du glaubst das eine Übertragung beendet ist.

: Bearbeitet durch User
von Rahul D. (rahul)


Lesenswert?

Tobias L. schrieb:
> hat einer eine Idee, woran es liegen kann?
An der falschen Dateiendung!? SCNR

Dir ist schon klar, dass die serielle Schnittstelle wesentlich langsamer 
als der Prozessor ist, oder?
Wenn da kein Zeichen in der Zwischenzeit eingegangen ist, wird die 
Schleife verlassen und du löscht den Puffer.

Du solltest den Puffer entweder per Interrupt in der ISR füllen, oder in 
einer Schleife prüfen, ob ein neues Zeichen vorliegt (und es in den 
Puffer schreiben).
Deine Statemachine habe ich mir nicht angeguckt.

Du könntest natürlich auch eine Echo-Funktion zu Debugzwecken basteln, 
die das empfangene Zeichen über das Bluetooth-Modul (an dein BT-Terminal 
auf dem PC) zurücksendet.

von Falk B. (falk)


Lesenswert?


von Obelix X. (obelix)


Lesenswert?

Tobias L. schrieb:
> ich habe eine ESP32 BT-Modul über die UART an einen Atmega88
> angeschlossen....

Den Atmega raus schmeißen und die Aufgaben des Atmega auch den ESP32 
erledigen lassen.

von Cartman E. (cartmaneric)


Lesenswert?

Obelix X. schrieb:

> Den Atmega raus schmeißen und die Aufgaben des Atmega auch den ESP32
> erledigen lassen.

Am besten gleich beides rauswerfen, und die Aufgabe einem anderen
übertragen. Wenn schon so Kleinigkeiten zur Stolperfalle werden...

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.