Forum: Mikrocontroller und Digitale Elektronik Analogwert Senden ?


von Michael H. (h_m)


Lesenswert?

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]

von Einer K. (Gast)


Lesenswert?

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.

von Rolf M. (rmagnus)


Lesenswert?

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.

von Wolfgang (Gast)


Lesenswert?

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.

von ich (Gast)


Lesenswert?

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.

von Michael H. (h_m)


Lesenswert?

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);

von Einer K. (Gast)


Lesenswert?

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.

von Joe F. (easylife)


Lesenswert?

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)

von Michael H. (h_m)


Lesenswert?

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

von Joe F. (easylife)


Lesenswert?

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

von Einer K. (Gast)


Lesenswert?

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.

von Dirk B. (dirkb2)


Lesenswert?

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);

von Wolfgang (Gast)


Lesenswert?

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 ...

von Patrick J. (ho-bit-hun-ter)


Lesenswert?

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

von Joe F. (easylife)


Lesenswert?

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.

von Route_66 H. (route_66)


Lesenswert?

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
Noch kein Account? Hier anmelden.