Hallo, ich möchte gerne einen Wert mit Uart puts() senden und zwar in 2 Byte. Wie kann ich da richtig vorgehen. Sagen wir er hat 16-bit 0-1024 dann schreibe ich das doch so ? int16_t Ausgabe_Wert = eingelesener_Wert hat zb.den Wert 512; warum geht das so nicht ? [c] while (1) { int16_t Ausgabe_Wert = 512; puts2( "%d\n", Ausgabe_Wert ); }[\c]
Ich befürchte, dass 512 die Übertragung von 3 Byte, plus Trennzeichen benötigt. Es ist also mit 4 Byte zu rechnen, wenn du es als String versendest. Binär würden 2 Byte reichen. Dann wirds aber mit den Trennern interessant. Wobei ich allerdings sagen muss, dass ich keine Funktion puts2() kenne.
Michael H. schrieb: > Hallo, > > ich möchte gerne einen Wert mit Uart puts() senden und zwar in 2 Byte. > Wie kann ich da richtig vorgehen. > > Sagen wir er hat 16-bit 0-1024 dann schreibe ich das doch so ? Wenn du das als Text ausgeben willst, reichen 2 Bytes nicht, denn "1024" sind ja alleine schon 4 Zeichen. Das \n, das du unten noch dran hängst, braucht nochmal ein Byte. Das sind also zusammen schon 5. > warum geht das so nicht ? > > [c] > > while (1) > { > > int16_t Ausgabe_Wert = 512; > > puts2( "%d\n", Ausgabe_Wert ); > > }[\c] Was ist puts2? Funktioniert das so wie printf? Dann sollte es so funktionieren.
Arduino F. schrieb: > Binär würden 2 Byte reichen. > Dann wirds aber mit den Trennern interessant. So spannend wird das nun auch nicht. Wer auch immer auf die Idee kommt, einen Wertebereich 0..1024 zuzulassen (binär wäre 0..1023 wohl deutlich sinnvoller), dann benätigt man 11 Bit für die Daten. Bei 2Byte-Übertragung ständen also von den 16 Bit insgesammt noch 5 Bit zu freien Verfügung. Also kann man in jedem Byte die oberen 2 Bit verwenden, um eine Synchronisationsinformation (0..1) und sogar noch ein Prüfbit mit zu übertragen.
Michael H. schrieb: > ich möchte gerne einen Wert mit Uart puts() senden und zwar in 2 Byte. Das würde ich für eine digitale Übertragung halten.
Rolf M. schrieb: > Was ist puts2? Funktioniert das so wie printf? Dann sollte es so > funktionieren. ja wie printf(); Wolfgang schrieb: > (binär wäre 0..1023 wohl deutlich sinnvoller), Das war auch der Plan, aber in keinem Buch das ich habe inkl. C Programmieren von Anafang an, finde ich kein Beispiel o.ä. das ich mir darunter etwas vorstellen kann, wie ich einen Wert in form von zwei Bytes senden kann. ich habe die Formatierungen noch einmal ausprobiert da steht keine für binä dabei. mit einem string kann ich mir nicht vorstellen wie das geht
1 | char string [] = ( "kann ich hiermit 2 Byte senden oder einen Wert ?" ); |
2 | |
3 | printf("%s", string); |
Michael H. schrieb: > ja wie printf(); printf() gibt IMMER Zeichenketten aus. Dein puts2() sicherlich auch. Und damit werden es eben bis zu 6 Byte. Unweigerlich. Um Binärdaten zu versenden, gibts öfter Funktionen wie write(). Aber du hältst ja geheim, welche Ausgabe Funktionen dir zur Verfügung stehen. Wolfgang schrieb: > Arduino F. schrieb: >> Binär würden 2 Byte reichen. >> Dann wirds aber mit den Trennern interessant. > > So spannend wird das nun auch nicht. > > Wer auch immer auf die Idee kommt, einen Wertebereich 0..1024 zuzulassen > (binär wäre 0..1023 wohl deutlich sinnvoller), dann benätigt man 11 Bit > für die Daten. Bei 2Byte-Übertragung ständen also von den 16 Bit > insgesammt noch 5 Bit zu freien Verfügung. Also kann man in jedem Byte > die oberen 2 Bit verwenden, um eine Synchronisationsinformation (0..1) > und sogar noch ein Prüfbit mit zu übertragen. Ich sehe nicht, dass solche Tricks hier so aus dem Stehgreif gelingen werden. Aber was solls, lasse mich gerne überraschen. Ich schätze, hier sollte erstmal der Unterschied zwischen formatierten ADC Werten und binären ADC Werten geklärt werden.
Warum müssen es denn unbedingt 2 Byte sein? Brauchst du eine hohe Übertragungsgeschwindigkeit? Wenn du binär überträgst, musst du dafür sorgen, dass der Empfänger weiss, welches der Bytes das höherwertige und welches das niederwertige ist. Du brauchst also in irgend einer Form auch eine Synchronisation. Nimm doch 5 Zeichen, und übertrage die Zahl als Text. Das 5. Zeichen ist ein Zeilenumbruch. Vorteile: - Du kannst die Übertragung mit einem Terminalprogramm mitlesen - Es gibt einen delimiter (Zeilenumbruch)
vielleicht ist es so besser vertändlich was ich mir vorstelle. Wenn ich es mit einer Arduino IDE schreibe sieht es so aus und funktioniert ein Byte zu senden.
1 | void loop() |
2 | {
|
3 | byte helligkeit = 125; |
4 | |
5 | Serial.println(helligkeit,BIN); |
6 | |
7 | }
|
ich will es aber in C üben und Haben
Michael H. schrieb: > ich will es aber in C üben und Haben 1 Byte binär: http://www.cplusplus.com/reference/cstdio/putc/ Mehrere Bytes (formatierter String): http://www.cplusplus.com/reference/cstdio/fprintf
Michael H. schrieb: > Wenn ich es mit einer Arduino IDE schreibe sieht es so aus und > funktioniert ein Byte zu senden. Nein! Das sind mindestens 8 gesendete Bytes.
Die Standardfunktion zum Senden von rohen (binär) Werten ist fwrite() Bei deinem Beispiel vom Eröffnugnspost:
1 | fwrite(&Ausgabe_Wert, sizeof(Ausgabe_Wert), 1, stdout); |
Joe F. schrieb: > Wenn du binär überträgst, musst du dafür sorgen, dass der Empfänger > weiss, welches der Bytes das höherwertige und welches das niederwertige > ist. Aaach! Liest du auch gelegentlich? Wolfgang schrieb: > Bei 2Byte-Übertragung ständen also von den 16 Bit insgesammt noch 5 Bit > zu freien Verfügung ...
Hi Ich sehe hier eine Wissenslücke bzw. WELCHER Wert das gesendete Byte nun sein soll. byte helligkeit = 125; erstellt die Variable 'helligkeit' als byte, wodurch die Werte 0...255 abgedeckt werden. Dieses Byte wird aber als Ziffernfolge versendet:Serial.println(helligkeit,BIN); Was mindestens die 8 Ziffern + cr/lf mit sich bringt. Wenn Du nun Helligkeit nicht als byte, sondern als INT deklarierst, kannst Du Werte 0...65535 (bzw. Deren Hälfte +/-, da nicht vorzeichenlos) darin speichern. Diese werden auch vom Arduino direkt als 16bit versendet, bei Deinem Beispiel kommen also ein paar Ziffern mehr dazu. MfG
Wolfgang schrieb: > Aaach! Liest du auch gelegentlich? Aber sicher doch, ich wollte deinen Beitrag keineswegs schmälern. Ich hielt es aber für angebracht das Synchronisationsproblem bei byteweiser Übertragung erneut anzusprechen, wenn es erlaubt ist. Wenn zwei der gleichen Meinung sind kann es ja nur richtig sein.
Michael H. schrieb: > aber in keinem Buch das ich habe inkl. C > Programmieren von Anafang an, finde ich kein Beispiel o.ä. Dann kannst du ja jedes Buch nutzen, denn nach deiner Logik steht in jedem Buch mindestens ein Beispiel, das du verwenden kannst, drin!
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.