Hallo zusammen,
ich habe mir ein VB.Net Programm geschrieben wo ich an einen Ic
(Atmega16) warte Zeiten ändern. Die Übertragung von VB zum Ic soll in
Ascii code passieren. Die Umwandlung in VB funktioniert
super, lasse es mir in einer Textbox anzeigen.
Wenn ich im Ic die Variable x (als Char oder uint8_t) umwandle und damit
z.B. eine warte Zeit einstellen möchte geht das nicht.
Ich habe mir auch schon die Variable x als Ascii wider an den Pc
geschickt da kommen immer unterschiedliche Werte an. Selbst wenn ich
direkt ein Ascii Variable schicke.
1
#include<avr/io.h>
2
#include<stdlib.h>
3
#include<inttypes.h>
4
#include<util/delay.h>
5
6
#define F_CPU 1000000 /* evtl. bereits via Compilerparameter definiert */
knoddelpusch schrieb:> c = uart_getc(); //Variable c mpfange> x = atoi (c); //Ascii variable c in variable x umwandeln
Äh. Nein.
An dieser Stelle müsste dein Compiler schon Zeter und Mordio schreien.
> itoa (65, z, 10); //65 in Ascii umwandeln entspricht A zum Testen
und hier gleich noch einmal.
Dir scheint der Unterschied zwischen einem einzelnen Character und einem
String komplett und völlig egal zu sein.
https://www.mikrocontroller.net/articles/String-Verarbeitung_in_C
Kauf dir ein C Buch und arbeite es zumindest bis zur Hälfte durch. Da
gibt es noch viele Dinge, die du wissen und können musst, ehe du
sinnvoll ein reales Programm schreiben kannst.
Hallo,
ich habe jezt mal im internet und auf dem link noch mehr informiert und
hoffe das ich das jetzt etwas mehr verstanden habe.
Jetzt müsste ich doch wenn ich einen Wert x an den Controller sende der
Wert in der Variable Line gespeicher sein oder?
Und mit dem "itoa (Line, Buffer, 10);" wandle ich den Wert x in ein
Ascii zeichen um?
oder hab ich da nochmal was falsch verstanden
1
#include<avr/io.h>
2
#include<stdlib.h>
3
#include<inttypes.h>
4
#include<util/delay.h>
5
#include<string.h>
6
7
8
//#include "uart.h"
9
10
#define F_CPU 1200000 /* evtl. bereits via Compilerparameter definiert */
knoddelpusch schrieb:> Jetzt müsste ich doch wenn ich einen Wert x an den Controller sende der> Wert in der Variable Line gespeicher sein oder?
Du sendest keinen 'Wert'.
Du sendest einen String! EInen Text.
An dieser Stelle gibt es noch keinen Unterschied, ob dieser Text "123"
oder "Hugo" beinhaltet. Text ist erst mal Text.
(UNd die Empfangsroutine erwartet, dass der Text mit einem Carriage
Return abgeschlossen ist. Denn woher soll diese Routine denn sonst
wissen, dass du nach "Hugo" nicht noch ein weiteres Zeichen senden
willst?)
Wenn du weisst, das dein Text eben nicht "Hugo" lautet, sondern "123",
dann kannst du die Funktion atoi benutzen, um aus diesem Text eine Zahl
mit dem Zahlenwert von 123 machen zu lassen. Erst dann hast du einen
Wert mit dem du zb auch rechnen kannst oder was auch immer du damit
machen willst.
Die umgekehrte Übertragungsrichtung lautet dann so:
du hast eine Zahl, die in einer int Variablen vorliegt. Da du sie
textuell (also in Form von ASCII Zeichen) übertragen willst, musst du
erst mal aus dieser Zahl einen entsprechenden String generieren lassen.
Das erledigt itoa. Es erzeugt aus der Zahl 123 den String "123". Wieder:
dieser String könnte prinizpiell auch "Hugo" oder "Anna" sein, das wäre
der String Sende Funktion völlig gleichgültig. Nur ist den String eben
nicht "Hugo", sondern "123". Ein Text wie jeder andere auch.
> Und mit dem "itoa (Line, Buffer, 10);" wandle ich den Wert x in ein> Ascii zeichen um?
Nein. Nicht in 1 ASCII Zeichen.
1 ASCII Zeichen ist 1 Buchstabe. Wobei unter Buchstaben auch Dinge wie
'=' oder '0' oder '7' oder ',' fallen. Den Begriff Buchstaben da jetzt
nicht zu wörtlich nehmen. Wichtig ist: es wäre genau 1ner.
Das kannst du aber nicht brauchen. Denn der String "Hugo" besteht aus 4
Buchstaben! Oder der String "123" - der besteht aus 3 Buchstaben- Oder
"65320", der besteht aus 5 Buchstaben.
Ein String ist also eine Abfolge von meheren Einzelbuchstaben. Um einen
String zu übertragen muss man daher Buchstabe für Buchstabe einzeln
übertragen. genau das macht die uart_puts.
Disclaimer: In C sind Strings immer um genau 1 Zeichen länger als sie
lesbare Buchstaben haben. Denn ganz zum Schluss kommt immer ein
Buchstabe mit dem ASCII Codewert von 0. Der String "Hugo" hat also in C
nicht 4 Buchstaben, sondern deren 5.
Das heist ich muss wenn ich vom Pc auf Ic "123" senden will danach noch
ein "\n" dranhängen?
Auch wenn mein Array gößer ist, ist dann die "Empfangsroutine"
abgeschlossen und mein Array ist dann halt nicht ganz gefüllt?
Mit "a=atoi(Line)"
weiße ich meiner variable a den Wert 123 zu.
Geht das auch wenn ich schon mit einem Ascii zeichen z.B. "A" rüberkomme
das ich die Zahl 65 bekomme?
Habe das irgendwo mal gelesen das ich mit der Funktion "atoi" einen
Ascii Zeichen wider in einen Wert umwandeln kann.
Oder ist die atoi funktion nicht direkt auf die Ascii-Tabelle bezogen.
Und mit "itoa (a, Buffer, 10)" erstelle ich mir wider einen String
(Buffer) der den Text "123" bzw das was in der Variable a steht.
Mit dem itoa bekomme ich ja dann schon einen Null-Terminierten string
zurück?
1
// UART konfig
2
3
voiduart_init(void)
4
{
5
UBRRH=UBRR_VAL>>8;
6
UBRRL=UBRR_VAL&0xFF;
7
8
UCSRB|=(1<<TXEN)|(1<<RXEN);//UART TX und RX einschalten
9
UCSRC=(1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);// Einstellen des Datenformats: 8 Datenbits, 1 Stoppbit