Hallo, ich habe folgende Schwierigkeit. Ich habe eine Testplatine, wo ich über UART vom PC paar Zahlen schicken möchte. als Beispiel (decimal) 1234 der mikrocontroller bekommt (hex) 31 32 33 34 wie kann ich das in eine decimalzahl im controller umwandelt? Also damit meine shortvarible den wert 1234 (dec) oder halt 0x4D2 hat. Vielen Dank! Mario
Mario schrieb: > wie kann ich das in eine decimalzahl im controller umwandelt? atoi http://www.cplusplus.com/reference/cstdlib/atoi/
Mario schrieb: > der mikrocontroller bekommt (hex) 31 32 33 34 Das sind ASCII-Zeichencodes. Wenn du von diesen Werten 0x30 sobtrahierst (Nummer der '0'), bekommst du den Wert der Zahl heraus. (0x31-0x30 = 1) Wenn du jetzt noch die Stellen mit dem dezimalen Wert multiplizierst, bekommst du auch die entsprechende Dezimalzahl heraus. Das kann man alles in eine Schleife verpacken und dann ist es hübsch.
Mario schrieb: > als Beispiel (decimal) 1234 > der mikrocontroller bekommt (hex) 31 32 33 34 Atmel Application Note 204: http://www.atmel.com/images/doc0938.pdf Und hier der Code dazu: http://www.atmel.com/images/AVR204.zip
Peter II schrieb: > atoi aber nur wenn das letzte Zeichen \0 ist. Hoffentlich wird das mitgesendet oder wenigstens ein \r welches man vor atoi zu \0 ersetzen kann.
Will man eine ZAHL übertragen, sollte man sich vorher (!) über den Wertebereich von BYTE, WORD, oder LONG im Klaren sein. Und zum Schluss einen Code für ZAHL IST ZU ENDE übertragen. Dafür reicht jedes NICHT-'0' bis '9'-Zeichen. So ein Zeichen muss aber folgen, sonst wird EWIG gewartet... Außerdem muss man sich im Klaren sein, wie man programmtechnisch eine neue Zahl an das Hauptprogramm signalisiert/abliefert. ZAHL = 0 EMPFANGE_ZAHL: ASCII '0'...'9' kommt: ZAHL mal 10 nehmen, vom empfangenen Byte '0' abziehen und zu ZAHL addieren. Zurück nach EMPFANGE_ZAHL Anderes Zeichen kommt: ZAHL in einen Puffer kopieren und "neue Zahl" melden! ZAHL = 0 Zurück nach EMPFANGE_ZAHL
Jacko schrieb: > Und zum Schluss einen Code für ZAHL IST ZU ENDE übertragen. dafür reicht ja normalerweise ein \r welches man zu \0 ersetzt und das gleich in ein Array of Char input_txt[MAXLAENGE]={0}; einliest.
:
Bearbeitet durch User
Joachim B. schrieb: > Jacko schrieb: >> Und zum Schluss einen Code für ZAHL IST ZU ENDE übertragen. > > > dafür reicht ja normalerweise ein \r welches man zu \0 ersetzt 1. Es reicht natürlich jedes beliebige Zeichen, was nicht im Vorrat der erlaubten Zeichen ist. 2. Irgendwelche Ersetzungen sind nicht nötig, wenn man dem "Decoder" einfach die Länge des Strings mit übergibt. Nullterminierte Strings sind C-Erfindung und nicht mehr. Insbesondere kein unabänderliches Axiom. Das kommt nur den C-Only-Typen so vor...
c-hater schrieb: > 2. Irgendwelche Ersetzungen sind nicht nötig, wenn man dem "Decoder" > einfach die Länge des Strings mit übergibt. Nullterminierte Strings sind > C-Erfindung und nicht mehr. Insbesondere kein unabänderliches Axiom. Das > kommt nur den C-Only-Typen so vor... mal nicht so c-hate :) klar kann man die Länge mit übertragen, bequemer ist doch zu terminieren und auch kürzer, ein \r und Ende ists. Eine Länge kann schon mehr Platz unnötig verschwenden.
Da man sowieso umwandel muss kann man auch einfach die beiden Bytes aus dem Speicher übertragen, die die 1234 darstellen, und sie auf PC-Seite(Mikrocontroller-Seite) wieder entsprechend zusammen setzen. Insbesondere bei Float-Werten ist das eine wesentlich effektivere Lösung als erst die entsprechenden Stellen mit atoi und ähnlichem umzuformen. ;)
M. K. schrieb: > Da man sowieso umwandel muss kann man auch einfach die beiden Bytes aus > dem Speicher übertragen, die die 1234 darstellen, und sie auf > PC-Seite(Mikrocontroller-Seite) wieder entsprechend zusammen setzen. > Insbesondere bei Float-Werten ist das eine wesentlich effektivere Lösung > als erst die entsprechenden Stellen mit atoi und ähnlichem umzuformen. > ;) dafür muss man sich dann aber Gedanken über ein Protokoll machen, weil man Anfang und ende nicht mehr erkennen kann.
Wenn man nur die Wandlung mit atoi macht (und sonst nichts weiter mit den Zeichen) dann braucht man noch nicht einmal die '\0', da atoi eh beim ersten Zeichen aufhört, das nicht zum Integer passt.
c-hater schrieb: > Nullterminierte Strings sind > C-Erfindung und nicht mehr. Sie machen aber die Programmierung einfacher. Vielleicht will man ja noch weitere Zahlen und Wörter parsen. Es ist auch kein Aufwand, da man ja eh auf das Zeilenende testen muß, das \n mit \0 zu überschreiben. Je nach OS und Terminalprogramm ist das Zeilenende auch unterschiedlich. Ich akzeptiere daher alle Kombinationen: "\n", "\r", "\n\r", "\r\n".
Peter II schrieb: > dafür muss man sich dann aber Gedanken über ein Protokoll machen, weil > man Anfang und ende nicht mehr erkennen kann. Darum muss man sich doch immer machen.
M. K. schrieb: > Peter II schrieb: >> dafür muss man sich dann aber Gedanken über ein Protokoll machen, weil >> man Anfang und ende nicht mehr erkennen kann. > > Darum muss man sich doch immer machen. aber viel weniger als bei einer ASCII Übertragung, weil man freie Steuerzeichen hat die nicht in den Daten vorkommen.
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.