Forum: Mikrocontroller und Digitale Elektronik UART zahl auslesen


von Tobias D. (tobias92)


Lesenswert?

Hallo,
ich bin gerade dran mit dem uart eine zahl auszulesen, die ich mit Hterm 
an den microcontroller sende. ich nutze ein mega16. bei zahlen bis 255 
klappt das auch ganz hervorragend, aber dann reicht das UDR register 
leider nicht mehr aus, in dem die ganzen zahlenwerte gespeichert werden, 
da es nur ein 8 bit register ist. das heißt, ich muss erst die higher, 
dann die lower bits ein einem regiter speichern und dann die zahlen 
zusammenfügen. aber wie mach ich das?
villt in einer interruptroutine, wenn ein zeichen erfolgreich empfangen 
wurde?

mfg
tobias

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Tobias Domhöfer schrieb:
> aber wie mach ich das?
Jetzt brauchst du eine Anfangs- und/oder Ende-Kennung.
Am besten überträgst du die Zahl gleich in ASCII (wie das der Rest der 
Welt eigentlich auch macht), dann kannst du die "üblichen" Zeichen wie 
z.B. CR, LF als Zeilenende und Zahlenende hernehmen. Und dann wandelst 
du den empfangenen String mit atio() in einen Integerwert um.

von Tobias D. (tobias92)


Lesenswert?

wie kann ich diese zeichen ans zeilenende ernehmen? ich versteh nicht so 
richtig, wie du das meinst...hast du evtl. da mal einen beispielcode 
für?

von Karl H. (kbuchegg)


Lesenswert?

Alles fängt schon mal damit an, dass du mitteilen solltest in welcher 
Sprache du programmierst.

von Tobias D. (tobias92)


Lesenswert?

ich programmiere in C

von Karl H. (kbuchegg)


Lesenswert?

OK.
Was Lothar meint:
Deine erste Priorität ist es jetzt erst mal nicht ein Byte zu empfangen, 
sondern einen String. Einen Text.

Dazu empfängt man solange Zeichem bis ein Zeilenende Zeichen ('\n') 
daher kommt, welches dem Empfänger mitteilt dass die Eingabe jetzt zu 
Ende ist. Die empfangenen Zeichen werden in einem char-Array 
zwischengespeichert.

Der auswertende Teil, der sich nach dem Zeilenende den String vornimmt, 
weiß jetzt, dass es sich um die Textdarstellung einer Zahl handelt und 
benutzt die Funktion atoi um daraus dann eine echte Zahl zu machen.


Einen String per UART zu empfangen findet sich jeden Tag mindestens 5 
mal hier im Forum. Und auch im AVR-GCC-Tutorial findet sich dazu eine 
Routine.

von Tobias D. (tobias92)


Lesenswert?

so, ich habe jetzt die funktion und habe den string empfangen. doch kann 
ich ihn leider nicht umwandeln, es will nicht mit atoi funktionieren.

hab schon viele beispiele gefunden, aber die funktionieren alle nicht. 
hat jemand villt mal ein codebeispiel für atoi?

tobias

von Karl H. (kbuchegg)


Lesenswert?

Tobias Domhöfer schrieb:
> so, ich habe jetzt die funktion und habe den string empfangen. doch kann
> ich ihn leider nicht umwandeln, es will nicht mit atoi funktionieren.

und das heisst jetzt was genau?

> hab schon viele beispiele gefunden, aber die funktionieren alle nicht.
> hat jemand villt mal ein codebeispiel für atoi?

char tmp[] = "1234";

int value = atoi( tmp );


Hinweis: Wenn atoi nichts liefert, ist wahrscheinlich schon den String 
im A....

Also: Lass dir zunächst den String wieder ausgeben und überprüf, ob der 
µC auch tatsächlich das empfangen hat, was du ihm gesendet hast.

NB: du schickst jetzt nicht mehr Binärzahlen durch die Gegend. Um dem µC 
die Zahl 532 zu übermitteln, drückst du in deinem Terminalprogramm die 
Tasten 5  3 und 2 gefolgt von einem Return.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Tobias Domhöfer schrieb:
> so, ich habe jetzt die funktion und habe den string empfangen. doch kann
> ich ihn leider nicht umwandeln, es will nicht mit atoi funktionieren.
Ein String in C muß mit einer 0 (Null) abgeschlossen sein. Diese 0 wirst 
du selber in die Zeichenkette einfügen müssen (z.B. wenn ein CR kommt, 
wird das durch 0 ersetzt und in den String eingetragen)...

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.