Aus 4 Ziffern (1;9;8;0) ein Int 1980 machen

Gast #1211660
Lesenswert?

Hallo Zusammen,

mit meinem Uart kann ich nur einzelne Zeichen übergeben, z.B.
1
int put_char (char c) {
2
  while(!(UCSR0A & (1 << UDRE))) {
3
  }
4
  UDR0 = c;
5
  return (0);
6
}
7
void put_chars (char *s) {
8
  while(*s) {
9
    put_char(*s);
10
    s++;
11
  }
12
}
13

14
int wert = 1980;
15

16
put_chars(wert );

beim Empfang habe ich dann den Buffer mit
1
rx_buffer[0] = '1';
2
rx_buffer[1] = '9';
3
rx_buffer[2] = '8';
4
rx_buffer[3] = '0';

Kann mir jemand sagen wie ich hieraus wieder int = 1980 mache?

Vielen Dank & Viele Grüße
Bernd
Gast #1211679
Lesenswert?

> > 1000 * rxbuffer(0) + 100 * rxbuffer(1) + 10 * rxbuffer(2) + rxbuffer(3)
> Nicht ganz. Er muss natürlich jeden String noch in Hex umrechnen. Da
> weiß ich aber nicht, wie das in C geht.
1000 * (rxbuffer(0)-'0' +
 100 * (rxbuffer(1)-'0' +
  10 * (rxbuffer(2)-'0' +
       (rxbuffer(3)-'0'

so könnte es gehen - ist aber wirklich verschwendung, wenn man wie 
üblich ab 1900 rechnet reicht auch ein Byte bis 2156 aus.
Gast #1211700
Lesenswert?

Hi Zusammen,

super vielen Dank.

verstehe ich das richtig
1
1000 * (rxbuffer(0)-'0') +
2
 100 * (rxbuffer(1)-'0') +
3
  10 * (rxbuffer(2)-'0') +
4
       (rxbuffer(3)-'0')

reicht nur bis 2155? leider zuwenig,
ich brauch 1700-4000...

Danke, Viele Grüße
Bernd
#1211706
Lesenswert?

@Bernd:

crazyhorse hatte wohl gedacht, du willst Jahreszahlen übergeben. Hier 
wird üblicherweise wohl mit dem Jahr 1900 angefangen. Will man nun die 
Jahreszahl mit 1 Byte übertragen, Wäre 1900 + 255 = 2155 die höchste 
übertragbare Jahreszahl.

Hat also mit deiner Anwendung eigentlich nichts zu tun ;)
Gast #1212794
Lesenswert?

Hallo Zusammen,

so ganz hab ich es leider noch nicht verstanden, denn bei
mir kommt folgendes raus
1
    // Deklaration
2
    unsigned int result[4];
3
    unsigned char received_data[20];
4

5
    // Empfangene Werte
6
    rxbuffer[0] = 0x02;
7
    rxbuffer[1] = 0x03;
8
    rxbuffer[2] = 0x03;
9
    rxbuffer[3] = 0x03;
10
  
11
    // Int Umrechnung
12
    result[0] = (int) 1000 *  (rxbuffer[0] - '0') +
13
                       100 *  (rxbuffer[1] - '0') +
14
                        10 *  (rxbuffer[2] - '0') +
15
                              (rxbuffer[3] - '0');
16

17
    // -------------------------------------------
18
    // Debug Ergebnis
19
    result[0] = 14541
20
    // Test, ob man mit diesen Zahlen rechnen kann
21
    result[0] * result[0] = 21545 ???

Kann mir das jemand erklären? Müßte ja eigenlich 2333
rauskommen....

Über jede Hilfe würde ich mich sehr freuen.

Vielen Dank
#1212808
Lesenswert?

Bernd wrote:
> Kann mir das jemand erklären? Müßte ja eigenlich 2333
> rauskommen....

Das kommt auf deine Eingabe an. Der Code basiert auf der Annahme, dass 
dein String die Zahlen in ASCII (also 0x30 - 0x39) beinhaltet, du 
verwendest hier jedoch direkt die Bytewerte 0-9 (0x00 - 0x09). Dafür 
kannst du die Subtraktion von '0' (0x30) weglassen, dann sollte es 
gehen.
Gast #1213380
Lesenswert?

1
    // Debug Ergebnis
2
    result[0] = 14541
3
    // Test, ob man mit diesen Zahlen rechnen kann
4
    result[0] * result[0] = 21545 ???
Natürlich kann man mit der Zahl rechnen, aber Integer hat halt nur 16 
Bit (-32768..32767)

Sieht man hier schön:
14541  = 0x38CD
0x38CD * 0x38CD = 0x0C9A5429
21545 =               0x5429

Gruß
Roland

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