Hallo, ich hab eine Frage, und zwar: Ist es bei der seriellen kommunikation immer üblich, strings oder chars zu senden, oder kann man direkt auch z.B. Integer-Datentypen versenden ? Ich habe nämlich einen ATmega328p, der auf der UART-Schnittstelle ein Signal erwartet. Dann habe ich noch eine C# WinForm, über die ich mittels Knopfdruck die in eine Textbox eingegebene Zahl über den SerialPort zum µC schicke. C# erwartet bei der SerialPort.Write - oder SerialPort.WriteLine-Methode einen String. Ich würde aber gerne einfach nur z.B. die Zahl 5 schicken, die eine LED 5 mal aufleuchten lässt. Wenn ich jetzt "5" als String sende, ist es dann ASCII 5, was der Dezimalzahl 53 entsprechen würde ? Wenn ich aber die Zahl "2" als String an meinen µC schicke, und dann das UDR-Register auslese und den Inhalt in einer Int-Variablen speichere, kommt 25 an. Warum ? Mich verwirrt das Ganze etwas. Danke schon mal im Voraus, LG Felix
Mit Text hat man ein einfaches Protokoll, d.h. '\n' zeigt das Paketende an. Text läßt sich auch gut mit einem Sniffer protokollieren. Bei Binärdaten muß man sich aber erst noch ein Prokoll ausdenken, wie Nachrichten eindeutig synchronisiert werden können.
Felix schrieb: > kann man direkt auch z.B. Integer-Datentypen versenden ? Kann man, allerdings mit der Einschränkung, dass der Datentyp nur 8 Bit haben darf. Wie willst du ihn sonst in das Senderegister vom UART reinbekommen? > Wenn ich jetzt "5" als String sende, ist es dann ASCII 5, was der > Dezimalzahl 53 entsprechen würde ? ... oder auch binär 0b110101 oder hex 0x35 oder octal 065
Felix schrieb: > Hallo, ich hab eine Frage, und zwar: > Ist es bei der seriellen kommunikation immer üblich, strings oder chars > zu senden, oder kann man direkt auch z.B. Integer-Datentypen versenden ? Üblich wird da wohl Garnichts sein. Es kommt immer darauf an was man erreichen will. Pro "Sendung" wird (meisst) ein Byte gesendet, was das bedeutet und welchen Wert das hat das ist rein davon abhängig was der Anwender beabsichtigt. Das Byte kann ein ASCII Zeichen sein, ein HEX-Zahl bedeuten, ein Byte beinhalten, ein Teil eines WORD sein oder Teil eines Single oder Strings. Der Anwender, oder der der die Kommunikation festgelegt hat, ist der der da sagt was ist. Technisch ist es egal, es ist immer ein Byte mit 8 Bit (meisst!). (es gibt auch mehrere "serielle Kommunikationen", auch das will in Überlegungen einbezogen sein.) Kurt
Ein UART kennt per Hardware nur bytes. Nun kann man einen 32bit Integer als 4 bytes nacheinander versenden. Wenn man das ein paar mal hintereinander macht und irgendwann geht ein byte verloren, weiss man nicht mehr wo man steht. Dh bedeutet man sollte sich besser ein Protokoll ausdenken.
Felix schrieb: > Wenn ich aber die Zahl "2" als String an meinen µC schicke, und dann das > UDR-Register auslese und den Inhalt in einer Int-Variablen speichere, > kommt 25 an. Warum ? Weil du mit großem Wahrscheinlichkeit einen Fehler in deinem Code hast. Entweder an der PC-Seite oder an der ATmega-Seite, oder vielleciht sogar en beide Seiten. Das ASCII-Zeichen '2' hat den Wert 50 (dezimal). Das hätte als Wert in deine Variabele ankommen sollen...
Unabhängig von deinem fehlenden Verständnis für den Unterschied zwischen ASCII- und Binärformat sieht es auf den ersten Blick so aus, als käme der ganze Frame um ein Bit verschoben ( 25 statt 50 ) beim Empfänger an. Was sagen denn die Status-Bits im UCRS0A wenn du die 25 ausliest? Und poste mal den AVR-Code und die Einstellungen des seriellen Port auf Seite des PC. Und was kommt an, wenn du statt ASCII '2' versuchsweise mal ASCII '9' sendest?
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.