Wandeln: INT in BCD (HEX?)

Hallo,

ich möchte das Arduino Board an meinen YAESU FRG-100 anschließen. Der YAESU hat die Seirelle TTL Einstlluing 4800,8,n,2. Soweit klar.

Er nimmt die Befehle aber so an, dass eine dezimale Zahl, z.B. 14230 in 0x01 0x42 0x30 imgewandelt wird. Wie mache ich das in C?

Ich danke Euch sehr für die Info.

Was ist die größte Zahl, die Du übertragen willst?

Nehmen wir einmal 8 Stellen an, daher die Rückgabe ist ein long. Wenn die Werte zu groß sind, werden nur die letzten 8 Stellen zurückgegeben. Sollen es nur 4 Stellen sein, die Typen von bcdval und des Rückgabewertes auf unsigend int ändern.

unsigned long BCDencode (unsigned long binval) {
unsigned long bcdval = 0;
for (int i=0; binval && i < sizeof(bcdval) * 8; i+=4) {
   bcdval += (binval % 10) << i;
   binval /= 10;
}
return bcdval;
}

Und weil es so lustig ist, gleich den Decode dazu:

unsigned long BCDdecode (unsigned long bcdval) {
unsigned long binval = 0;
for (int i=1; bcdval; i *=10) {
   binval += (bcdval & 0xf) * i;
   bcdval >>= 4;
}
return binval;
}

Der Code wie immer ungetestet.

Korman

Der Code wie immer ungetestet.

Brauchst Du Alfa oder Beta-Tester? ;) ;) ;)

Im ernst: Als Augabe der Umwandlung dezimal -> BCD ist es für DE8MSH nicht notwendig eine Array mit den BCD-Werten für jede Stelle zu haben um diese dann einzeln Stelle für Stelle über die Serielle Schnittstelle zu schicken?

Viele Grüße Uwe

Brauchst Du Alfa oder Beta-Tester?

Nein danke, Code testen wird nur zur Arbeit, und zu Arbeit gehört auch Lohn. Deshalb poste ich entweder Code, den ich irgendwo herumliegen habe oder Zeugs, das mir so in den Sinn kommt. Nur wenn es ein wirklich interessantes Problem ist, wird es auch ausprobiert.

Korman

Also ich möchte, oder muss :), von 52 (kHz) bis 29.999 (kHz) umwandeln.

Es werden 5 Byte seriell übertragen. Das erste Byte ist der Befehl. Z.B. 0x0A (10) für "Stelle Frequenz auf" und dann die vier Byte für die Frequenz. Also z.B. 0x0A 0x01 0x42 0x30 0x00 für 14.230,00 kHz.

Ich werde den o.g. Code gleich mal testen...

Wenn du nur 4 Stellen brauchst, ersetze die long durch int. Beim Abschicken musst nur aufpassen, dass die Reihenfolge der Bytes stimmt.

Korman

An Korman sage ich "Danke"! Es klappt. :)