Forum: Mikrocontroller und Digitale Elektronik Empfangen mehrerer Zeichen


von Christian (Gast)


Angehängte Dateien:

Lesenswert?

Hallo
Ich hoffe jemand kann mir helfen.
Ich möchte mit einem ATMEGA32 mehrere Zeichen empfangen.
das funktioniert jedoch nicht.Senden funktioniert.

Was mache ich falsch?

Ich habe meinen Code im Dateianhang.

Danke

von Stefan (Gast)


Lesenswert?

Sieht korrekt aus. Bis auf diese Zeile:

UBRRL = 25;//(unsigned char) baud;

Bist du sicher mit den 2400 Baud? Mir sieht das eher wie 9600 Baud bei
4 MHz F_CPU aus.

Hardwaremäßig alles richtig beschaltet? PC Terminalprogramm korrekt
eingestellt?

von Robert W. (rweber)


Lesenswert?

Dein input buffer benötigt mindestes eine Größe von 3 bytes. 2 für
deine Daten + 1 Byte für \0 sonst könnte dein strcmp ins nirwana
laufen.
Oder du verwendest einen strncmp.

Gruß,
rweber

von Christian (Gast)


Lesenswert?

UBRRL = 25; stimmt weil ich den internen 1 MHz Oszillator verwende.

Und Hardwaremäßig müsste auch alles ok sein da ich einen STring senden
kann.
Ich kann ein einzelnes Zeichen Empfangen nur sobald es mehr als eines
sind funktioniert es nicht mehr.

Jedoch verwende ich wenn ich ein einzelnes Zeichen empfange nicht diese
Schleife.

for (i = 0;i<=1;i++)
{
input[i]= USART_Receive();


}

von inoffizieller WM-Rahul (Gast)


Lesenswert?

>Jedoch verwende ich wenn ich ein einzelnes Zeichen empfange nicht
>diese Schleife.

Wie sieht das sonst aus?

von Karl heinz B. (kbucheg)


Lesenswert?

Kurze Zwischenfrage:

Wie oft, denkst du, wird diese Schleife durchlaufen:

    for (i = 0;i<=1;i++){

Nimm mal die Finger zuhilfe, spiel in Gedanken Computer
und arbeite deinen Code mal ab.

Hinweis: Die Schleife wird solange durchlaufen, wie der
2. Ausdruck im for wahr ist!

von Karl heinz B. (kbucheg)


Lesenswert?

Ich nehm alles zurück (wasn heute los? heut passieren mir die
lächerlichsten Fehler).

Der Fehler ist, dass du den String nicht mit einem '\0'
Zeichen abschliesst. Das heist: Deine 2 empfangenen Zeichen
bilden noch keinen String! Daher kannst du auch keinen
strcmp zum Vergleichen benutzen.

von Robert W. (rweber)


Lesenswert?

Darauf hatte ich auch schon hingewiesen.

von Hannes L. (hannes)


Lesenswert?

> UBRRL = 25; stimmt weil ich den internen 1 MHz Oszillator verwende.

Das wäre mir zu unzuverlässig. Wenn ich UART nutze, verwende ich auch
grundsätzlich einen baudratentauglichen Quarz.

...

von Sonic (Gast)


Lesenswert?

Wieso benutzt Du nicht den Interrupt (RX-Complete)? Mit dem hatte ich
noch nie Probleme, macht den Rest des Programmes auch weniger
zeitkritisch (Polling). Freigeben und sperren kann man den USART durch
setzen und löschen von RXEN, nicht RXCIE. Wenn möglich sollte man die
Benutzung der Interrupts immer vorziehen.

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.