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
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?
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
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(); }
>Jedoch verwende ich wenn ich ein einzelnes Zeichen empfange nicht >diese Schleife. Wie sieht das sonst aus?
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!
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.
> 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.
...
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.