Forum: Mikrocontroller und Digitale Elektronik Aus 4 Ziffern (1;9;8;0) ein Int 1980 machen


von Bernd (Gast)


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

von Muraer (Gast)


Lesenswert?

1000 * rxbuffer(0) + 100 * rxbuffer(1) + 10 * rxbuffer(2) + rxbuffer(3)

von Sven S. (stepp64) Benutzerseite


Lesenswert?

Muraer wrote:
> 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.

von Michael G. (linuxgeek) Benutzerseite


Lesenswert?

Ist ziemlich verschwenderisch codiert, Du koenntest einen 16-Bit-Integer 
auch in 2 Bytes uebertragen, zumal Du dann sogar noch weiter als bis 
9999 kommst ;)

von Mario M. (Gast)


Lesenswert?

Das würde wohl mit atoi gehen. (Ascii to Integer)

von Peter (Gast)


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.

von Peter (Gast)


Lesenswert?

klammer muss noch zu

1000 * (rxbuffer(0)-'0') +
 100 * (rxbuffer(1)-'0') +
  10 * (rxbuffer(2)-'0') +
       (rxbuffer(3)-'0')

von Sven S. (stepp64) Benutzerseite


Lesenswert?

Naja, manchmal möchte man aber nur ASCII auf der Seriellen übertragen um 
den Datenverkehr problemlos mit einem Terminal zu beobachten.

von H.Joachim S. (crazyhorse)


Lesenswert?

"so könnte es gehen - ist aber wirklich verschwendung, wenn man wie
üblich ab 1900 rechnet reicht auch ein Byte bis 2156 aus."
naja - ein Byte gesparten RAM, dafür jedesmal ne Menge Flash, wenn ich 
mit dem Datum rechnen will/muss? Ich nehm int dafür.

von H.Joachim S. (crazyhorse)


Lesenswert?

ausserdem reicht es nur bis 2155, das ist mir zu knapp:-)

von Bernd (Gast)


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

von Helmut L. (helmi1)


Lesenswert?

Das ganze funktioniert doch bis 9999

Gruss Helmi

von Bernd (Gast)


Lesenswert?

ah, ok, werd's mal versuchen,

vielen Dank.

von Roland P. (pram)


Lesenswert?

nein
ein rxbuffer(0)-'0' wandelt die Zeiche "0".."9" in eine Zahl 0..9 um
Somit reicht das von 0..9999

(genaugenommen von  -53328..229977 :)
Gruß
Roland

von Jens S. (djstorm)


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

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

oder als Schleife auch für variable Längen:
1
char[] zahl = { '1', '9', '6', '7', '8'};
2
int ergebnis = (int)(zahl[0]-'0');
3
for (int j=1;j<zahl.length;j++) {
4
    ergebnis = ergebnis * 10;
5
    ergebnis = ergebnis + (int)(zahl[j]-'0');
6
}
7
System.out.println("Zahl: "+ergebnis);

von Bernd (Gast)


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

von Bernd (Gast)


Lesenswert?

(in der Deklaration muß "received_data[20]" natürlich "rxbuffer[20]" 
heißen...)

von Ahem (Gast)


Lesenswert?

1
    rxbuffer[0] = 0x02;
2
    rxbuffer[1] = 0x03;
3
    rxbuffer[2] = 0x03;
4
    rxbuffer[3] = 0x03;

und was für ein Zeichen soll äquivalent zu 0x02 sein?

Guck mal in eine ASCII-Tabelle Deiner Wahl!

von Helmut L. (helmi1)


Lesenswert?

>   // Empfangene Werte
>    rxbuffer[0] = 0x02;
>    rxbuffer[1] = 0x03;
>    rxbuffer[2] = 0x03;
>    rxbuffer[3] = 0x03;

Das sind keine ASCII werte !

'2' = 0x32 und nicht 0x02

von Philipp B. (philipp_burch)


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.

von Bernd (Gast)


Lesenswert?

Hi Zusammen,

vielen Dank für Eure Hifle, Es klappt :)

von Roland Praml (Gast)


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

von Sven P. (Gast)


Lesenswert?

Nach diversen syntaktisch falschen Beispielen und Ausflügen in Java 
würde ich mal vorschlagen, einen Blick ins C-Handbuch zu werfen, so in 
der Ecke, wo 'strtoul' steht...

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.