Forum: Mikrocontroller und Digitale Elektronik Arduino UNO USART Daten fehlen


von Egonwalter M. (heiner1234)


Angehängte Dateien:

Lesenswert?

Hallo



Ich teste gerade den USART des Arduino UNO mit hTerm - ich sende per 
hTerm einen String und zähle, wie oft der String gesendet und vom 
Arduino empfangen wird.

Hardware:
- Arduino per USB mit PC verbunden, verwendet Port6.
- XBEE Empfänger per USB mit PC verbunden, verwendet Port7.
- XBEE Sender wird (später) am USART des Arduino angeschlossen.
- hTerm- sende String 10mal, kürzest mögliche Zeit 100ms, 8n1, 115,2kB

Empfang nur durch Arduino:
- Wenn ich den String 10mal per hTerm sende (kürzeste Sendezeit 100ms), 
wird der String nur 9mal empfangen (Zähler ist 9), wenn der Empfang 
durch den USART des ATMega16U2 erfolgt - reproduzierbar (Arduino per USB 
am PC, verwendet Port6), kein XBEE Sender am Arduino USART.

Empfang durch XBEE Modul am USART des Arduino:
- Wenn ich ein XBEE Sendemodul am Arduino UNO - USART anschließe, und 
ich sende den String 10mal mittels hTerm (über Port7 = XBEE), zeigt der 
Empfangszähler 10 an - reproduzierbar.
Der Empfang mittels  USART des ATMega16U2 fkt. nicht, wenn ein XBEE 
Modul am USART hängt - wenn ich auf Port6 sende (Arduino Port), zeigt 
das Terminal nichts an (keine Daten empfangen).

Mir ist nicht klar, warum beim Empfang durch den ATMega16U2 nur 9 von 10 
Telegrammen empfangen werden und warum kein Empfang auf Port6 (Arduino - 
Port), wenn ein XBEE Modul am USART angeschlossen
ist.

Falls es jemand testen will - ich habe zu  Testzwecken die files 
angehängt (als Test_Usart.zip); sendewert7.txt ist der zu sendende 
String.

von Kuppi (Gast)


Lesenswert?

Egonwalter M. schrieb:

> Mir ist nicht klar, warum beim Empfang durch den ATMega16U2 nur 9 von 10
> Telegrammen empfangen werden und warum kein Empfang auf Port6 (Arduino -
> Port), wenn ein XBEE Modul am USART angeschlossen
> ist.

Der Uno hat nur ein UART. Wenn du ein XBEE Modul an TX/RX angeschlossen 
hast arbeiten der ATMega16U2 und das XBEE Modul gegeneinander, und der 
Stärkere gewinnt. Das ist in deinem Fall wohl das XBEE Modul.

Wenn bei der seriellen Kommunikation über USB auf dem PC das Serial Port 
geöffnet wird, wird auf dem Uno über den 16U2 ein Reset ausgelöst, und 
der ATMega328 läuft in den Bootloader. Alles was der PC währenddessen 
sendet geht verloren (fast alles, Kommandos an den Bootloader werden 
natürlich ausgewertet).

https://forum.arduino.cc/t/does-arduino-reset-when-first-connected-to-usb/544278
https://forum.arduino.cc/t/uno-r3-usb-serial-reset/191102

von Stefan F. (Gast)


Lesenswert?

Dein Aufbau ist sehr unklar beschrieben, zeichne das mal auf.

von Axel R. (axlr)


Lesenswert?

Zeile39 falsch gegendert ;)
1
static volatile uint8_t zaehler2_t0 = 0; /* Zaehler2 Timer0 - Progammlaufzeit "innen" */

kleiner Scherz ;)

das einzige was mir auffällt, weil ich es nicht machen würde, ist das 
ausschalten des Empfangs (Zeile 116/117 usart0.cpp)
1
      rec_flag1 = 1;                /* Eintrag fertig -> Empfangs-Flag = 1*/
2
      UART0_CONTROL &=~(1 << UART0_BIT_RXEN);    /* ausschalten receive */

Und das mit "PORT6" hab ich nicht verstanden. Meinst Du COM6 am PC, wo 
das ZigBee Modul drannhängt oder hängt das ZigBee mit am Atmel drann?

Programm sieht (für mich) hingegen klar strukturiert aus.
Einzig die Stringerkennung würde für meinen Geschmack etwas zu lange 
dauern, das kann aber täuschen:
1
tatic void usart0_empfang_daten(void) {
2
3
  utoa(strlen(rec_buf1), temp_buf, 10);  /* Laenge des Receive */
4
  usart0_puts(temp_buf);
5
  usart0_putc(' ');
6
  utoa(string_count, temp_buf, 10);      /* Anzahl Daten */
7
  usart0_puts(temp_buf);
8
  usart0_putc(' ');
9
  usart0_puts(rec_buf1);          /* was wurde empfangen */
10
}
11
12
/* Fehlerauswertung Empfang USART */
13
static void usart0_empfang_auswert(void) {
14
15
  if(rec_flag1) {
16
    string_count++;
17
    usart0_empfang_daten();
18
    rec_flag1 = 0;
19
    UART0_CONTROL |=(1 << UART0_BIT_RXEN);  /* einschalten receive */
20
  }
21
}
Da wird dann das recieve-bit auch wieder aktiviert, WENN das rec_flag1 
gesetzt wurde.
Denke, da beißt sich was mit dem 70mSekunden. Ich würde den Empfang 
eingeschaltet lassen. Aber hast Du sicher schon getestet.

von Kark (Gast)


Lesenswert?

Axel R. schrieb:
> Zeile39 falsch gegendert ;)
> static volatile uint8_t zaehler2_t0 = 0; /* Zaehler2 Timer0 -
> Progammlaufzeit "innen" */
>
> kleiner Scherz ;)

Gendern ist kein Scherz du Sexist!

von Rack (Gast)


Lesenswert?

Sehe ich auch so. Sicher ein Nazi. Zum fremdschämen. Was ist nur aus 
unserem sozialistischen schönen Staat geworden?

von Stefan F. (Gast)


Lesenswert?

Kark schrieb:
> Gendern ist kein Scherz du Sexist!

Doch ist es. Angeblich geht es um die Unterdrückung der Frau durch 
Sprache.

Doch bei negativen Dingen nutzen sie gerne den eindeutig männlichen 
Ausdruck, wie "der Mörder", "der Täter", etc. Das ist inkonsequent. Sie 
fordern auch keine Gleichberechtigung der Frauen im Bergbau und beklagen 
sich nicht über zu wenige (männliche) Geburtshelfer und versuchen nicht 
einmal, ein männliches Wort für "die Hebamme" zu finden.

Sie gendern teilweise sogar Worte, die gar nichts mit Menschen zu tun 
haben. Sie korrigieren ganz empört auf "die Hündin" wenn jemand sagt "oh 
ihr Hund ist aber schön", anstatt das Lob wahrzunehmen. Andererseits 
sagen sie jedoch stets "der Hirsch" auch wenn es ein Weibchen ist.

Deswegen kann man das nicht ernst nehmen. Es ist wie bei verwandten 
Themen: Der Negerkuss bleibt ein Negerkuss, auch wenn da kein Neger drin 
ich ist und ich keinen Menschen so nennen würde. Und die 
gesellschaftliche Position der Zigeuner hat sich nicht verbessert, seit 
man Schnitzel anders nennt.

Überhaupt hat erzwungene Veränderung der Sprache noch nie jemandem gut 
getan.

von Egonwalter M. (heiner1234)


Angehängte Dateien:

Lesenswert?

Hallo

Stefan ⛄ F. schrieb:
> Dein Aufbau ist sehr unklar beschrieben, zeichne das mal auf.

=> siehe Anhang
nochmal zur Erläuterung:

- Wenn kein XBEE Modul angeschlossen ist (nur der Arduino via PORT 6) 
und hTerm sendet 10x den String, wird er nur
9x gezählt - als würde er nur 9mal empfangen

- wenn das XBEE Modul angeschlossen ist und über PORT7 ( = XBEE Port) 
10x gesendet wird, wird
10x empfangen gezählt => 10x gesendet, 10x empfangen

- wenn das XBEE Modul angeschlossen ist und hTerm auf PORT6 umgeschaltet 
wird (Arduino PORT) und
10x gesendet wird, wird nichts angezeigt => nichts empfangen (Arduino 
PORT6 soll empfangen)

@von Axel R. (axlr)15.05.2021 10:16

"Da wird dann das recieve-bit auch wieder aktiviert, WENN das rec_flag1
gesetzt wurde.
Denke, da beißt sich was mit dem 70mSekunden. Ich würde den Empfang
eingeschaltet lassen. Aber hast Du sicher schon getestet."

Ja, das ist kein Problem; Abfrage alle 70ms, gesendet wird alle 100ms.

: Bearbeitet durch User
von Stefan F. (Gast)


Angehängte Dateien:

Lesenswert?

Dann hat Kuppi den Kurzschluss ja schon korrekt erkannt. Du hast da zwei 
Tx Ausgänge die gegeneinander arbeiten.

Du hast dich schon wieder unklar ausgedrückt:

> wenn das XBEE Modul angeschlossen ist

Welches? In deiner Zeichnung sehe ich zwei.

von Egonwalter M. (heiner1234)


Lesenswert?

Hallo

Stefan ⛄ F. schrieb:
> Dann hat Kuppi den Kurzschluss ja schon fast korrekt erkannt. Du hast da
> zwei Tx Ausgänge die gegeneinander arbeiten.
>
> Du hast dich schon wieder unklar ausgedrückt:
>
>> wenn das XBEE Modul angeschlossen ist
>
> Welches? In deiner Zeichnung sehe ich zwei.

Naja, ich habe ja auch 2 XBEE Module - eines ist an PD0/PD1 
angeschlossen, eines am PC.

Mit XBEE Modulen kann man eine kabellose Verbindung (aka Sender - 
Empfänger) aufbauen. Ein Modul alleine reicht nicht

von Stefan F. (Gast)


Lesenswert?

Ich gebe auf. Hier besteht nicht nur ein technische 
Kommunikationsproblem.

von Egonwalter M. (heiner1234)


Lesenswert?

Stefan ⛄ F. schrieb:
> Ich gebe auf. Hier besteht nicht nur ein technische
> Kommunikationsproblem.

Kein Problem!
Tut mir leid, wenn Du meine Testanordnung nicht verstehst. Dennoch Danke 
für Deine Hilfe

von Stefan F. (Gast)


Lesenswert?

Egonwalter M. schrieb:
> Tut mir leid, wenn Du meine Testanordnung

Die ist mir nach der Zeichnung klar, aber unklar ist dein Text, was du 
gemacht hast. Ist aber auch egal, das eigentliche Problem wurde ja schon 
heute morgen erkannt.

Beitrag #6692683 wurde vom Autor gelöscht.
von Stefan F. (Gast)


Lesenswert?

Wenn du mehr als 80 Zeichen sendest ist das kein Wunder denn der 
Empfangspuffer auf dem µC hat nur für 80 Zeichen Platz.

Aber wie lang deine Strings sind, soll ich mir jetzt auch wieder selber 
ausdenken, oder wie?

Kommuniziere klarer!

Nachtrag: Jetzt ist die Frage weg, auf die ich antwortete. So hat das 
keinen Sinn, der ganze Thread ist Zeitverschwendung.

von Egonwalter M. (heiner1234)


Lesenswert?

Hallo Stefan

In meinem Eingangspost ist ein Zip-file mit allen Dateien, u.a. eine 
Datei “sendewert7.TXT” und der ist 65 Bytes lang - also wesentlich 
kleiner als 80 Bytes.

Die Länge meiner Strings ist per define vorgegeben- steht alles in 
meinen Sourcen im zip-file.

Ich bin Dir für Deine Hilfe dankbar, aber Du solltest dann auch alle 
meine Posts lesen.

Nichts für ungut.

Nb - wo steht, dass der Prozessorempfangspuffer nur Platz für 80 Zeichen 
(Bytes, meinst Du wohl) hat??

Und welche Frage soll weg sein?

: Bearbeitet durch User
von Stefan F. (Gast)


Lesenswert?

Egonwalter M. schrieb:
> Ich bin Dir für Deine Hilfe dankbar, aber Du solltest dann auch alle
> meine Posts lesen.

Das habe ich getan. Aber dass diese Textdatei deine gesendeten Strings 
enthält, hast du nicht erwähnt. Selbst wenn, wäre ich mangels Info davon 
ausgegangen, dass du diese 65 Zeichen 10x gesendet hast, also insgesamt 
wohl 650 Zeichen.

Egonwalter M. schrieb:
> Nb - wo steht, dass der Prozessorempfangspuffer nur Platz für 80 Zeichen
> (hat??

In deinem Quelltext, den ich mir angeschaut habe:

usart0.h:
1
#define RT_LEN1 65

usart0.cpp (eigentlich ist eine *.c Datei, nicht c++):
1
char rec_buf1[BUF1];
2
3
ISR(UART0_RECEIVE_INTERRUPT) {
4
    c1 = UART0_DATA;
5
    ...
6
    rec_buf1[rec_count1] = c1;
7
    rec_count1++;
8
    ...                
9
}

> Bytes, meinst Du wohl

Nein, Zeichen. Steht das ganz deutlich.

von Egonwalter M. (heiner1234)


Lesenswert?

Hallo Stefan

Grundgütiger!

Bitte betrachte die Angelegenheit als erledigt.

Alle Informationen sind im Eingangspost zu finden -das ZIP-file, wie oft 
der String gesendet wird usw.

Und von wegen 80 Bytes - es können auch mehr sein, die Größe ist in der 
Variable BUF definiert

Nochmals Danke

Und bitte betrachte es als erledigt!

: Bearbeitet durch User
von Stefan F. (Gast)


Lesenswert?

Egonwalter M. schrieb:
> Alle Informationen sind im Eingangspost zu finden -das ZIP-file, wie oft
> der String gesendet wird usw.

Nein, deine Informationen sind unklar.

Ich nehme jetzt an, dass du versucht hast, den 65 Zeichen langen String 
aus der Textdatei 10x sofort hintereinander zu senden.

Das kann nicht gehen, denn dein Programm auf dem µC ist nur für 
Half-Duplex Kommunikation ausgelegt. Half-Duplex bedeutet: Nach dem 
Empfang eines Strings wird er verarbeitet, das dauert. Während dieser 
Zeit ist dein µC nicht empfangsbereit. Erst wenn der µC die Verarbeitung 
beendet hat und die Antwort los geworden ist, kann wird er für den 
nächsten String bereit.

Darauf hat Axel R. bereits hingewiesen.

Eine Full-Duplex Kommunikation erfordert einen größeren Empfangspuffer 
(Ringbuffer).

Leider bist du auf keinen Hinweis eingegangen, der dir gegeben wurde. 
Wir wissen also gar nicht, ob du uns überhaupt verstanden hast und ob 
unsere Vorschläge geholfen haben. Stattdessen hast du dich immer wieder 
darüber beklagt, dass ich dich nicht verstanden habe. Offenbar geht es 
den anderen potentiellen Helfern nicht besser, sonst wäre ich nicht der 
einzige, der dir zu helfen versuchen würde. Ich bin halt der mit dem 
Helfersyndrom.

Wir können das Thema hier abschließen. Die Fehler wurden erkannt und 
beschrieben. Beheben musst du sie selbst.

von Egonwalter M. (heiner1234)


Lesenswert?

Hallo Stefan

Grundgütiger!!!

Ich hatte Dich doch schon mit meinem vorherigen Post  gebeten, die 
Angelegenheit als erledigt zu betrachten:

Egonwalter M. schrieb:
> Hallo Stefan
>
> Grundgütiger!
>
> Bitte betrachte die Angelegenheit als erledigt.
>
> Alle Informationen sind im Eingangspost zu finden -das ZIP-file, wie oft
> der String gesendet wird usw.
>
> Und von wegen 80 Bytes - es können auch mehr sein, die Größe ist in der
> Variable BUF definiert
>
> Nochmals Danke
>
> Und bitte betrachte es als erledigt!

Ich muss zugeben - Deine fehlende Kompetenz machst Du mit Penetranz mehr 
als wett.

von Stefan F. (Gast)


Lesenswert?

Ich verstehe, du möchtest gar keine Hilfe. Dann muss ich diesen Thread 
hier allerdings als mutwillige Provokation von Ärger (Trollerei) 
empfinden.

Dann halt nicht. Lebe wohl.

Dein Frust ist aber noch lange kein Grund, mich zu beleidigen. Dein 
Benehmen ist unter aller Würde.

von weiter weg (Gast)


Lesenswert?

An Egonwalter:

Stefan ist hier sehr bekannt und gibt den Leuten hier geduldig
und ausführlichst Hilfestellung in allen möglichen Dingen. Warum
das bei dir nicht klappt musst du dir selbst überlegen. Mein
Hinweis dazu: du siehst leider nicht die hunderte von anderen
Leuten des Forums die sich mit Grauen von diesem Thread
abwenden und nichts mit dir und deiner geschmackvollen
Programmierung zu tun haben wollen.

von Egonwalter M. (heiner1234)


Lesenswert?

Grundgütiger!!

Was ist denn an "Bitte betrachte die Angelegenheit als erledigt." nicht 
zu verstehen??

von Karl B. (gustav)


Lesenswert?

Egonwalter M. schrieb:
> Was ist denn an "Bitte betrachte die Angelegenheit als erledigt." nicht
> zu verstehen??

Hi,
es reicht nicht, den Forenleuten hier einen Brocken hinzuwerfen,
um dann, wenn Du keine Lust mehr hast, einfach den Not-Aus-Knopf zu 
drücken.
Die Menge an Gehirnschmalz, die andere User hier reingesteckt haben,
um Deinen Überlegungen folgen, möchte jetzt auch adäquat gewürdigt 
werden.
Und @Stefanus hat Dir ja schon Tipps gegeben.
Egonwalter M. schrieb:
> Ich muss zugeben - Deine fehlende Kompetenz machst Du mit Penetranz mehr
> als wett.
Und sowas ist einfach nur fies, wie man in Düsseldorf zu sagen pflegt.

Worte des Dankes kommen einem offenbar nur schwer über die Lippen. :(

ciao
gustav

von Egonwalter M. (heiner1234)


Lesenswert?

Fühlst Du Dich nun besser?

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.