Analogwert Senden ?

OP #5175476
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]
Gast #5175500
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.
#5175512
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.
Gast #5175568
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.
OP #5175602
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);
Gast #5175619
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.
#5175626
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)
OP #5175672
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
#5175733
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren