www.mikrocontroller.net

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


Autor: Bernd (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Zusammen,

mit meinem Uart kann ich nur einzelne Zeichen übergeben, z.B.

int put_char (char c) {
  while(!(UCSR0A & (1 << UDRE))) {
  }
  UDR0 = c;
  return (0);
}
void put_chars (char *s) {
  while(*s) {
    put_char(*s);
    s++;
  }
}

int wert = 1980;

put_chars(wert );


beim Empfang habe ich dann den Buffer mit

rx_buffer[0] = '1';
rx_buffer[1] = '9';
rx_buffer[2] = '8';
rx_buffer[3] = '0';


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

Vielen Dank & Viele Grüße
Bernd

Autor: Muraer (Gast)
Datum:

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

Autor: Sven Stefan (stepp64) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Michael G. (linuxgeek) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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 ;)

Autor: Mario M. (mariom)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das würde wohl mit atoi gehen. (Ascii to Integer)

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
klammer muss noch zu

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

Autor: Sven Stefan (stepp64) Benutzerseite
Datum:

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

Autor: H.Joachim Seifert (crazyhorse)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: H.Joachim Seifert (crazyhorse)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ausserdem reicht es nur bis 2155, das ist mir zu knapp:-)

Autor: Bernd (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Zusammen,

super vielen Dank.

verstehe ich das richtig

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


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

Danke, Viele Grüße
Bernd

Autor: Helmut Lenzen (helmi1)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das ganze funktioniert doch bis 9999

Gruss Helmi

Autor: Bernd (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ah, ok, werd's mal versuchen,

vielen Dank.

Autor: Roland Praml (pram)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Jens Schmitt (Firma: eXtensive media) (djstorm)
Datum:

Bewertung
0 lesenswert
nicht 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 ;)

Autor: Läubi .. (laeubi) Benutzerseite
Datum:

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

Autor: Bernd (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Zusammen,

so ganz hab ich es leider noch nicht verstanden, denn bei
mir kommt folgendes raus

    // Deklaration
    unsigned int result[4];
    unsigned char received_data[20];

    // Empfangene Werte
    rxbuffer[0] = 0x02;
    rxbuffer[1] = 0x03;
    rxbuffer[2] = 0x03;
    rxbuffer[3] = 0x03;
  
    // Int Umrechnung
    result[0] = (int) 1000 *  (rxbuffer[0] - '0') +
                       100 *  (rxbuffer[1] - '0') +
                        10 *  (rxbuffer[2] - '0') +
                              (rxbuffer[3] - '0');

    // -------------------------------------------
    // Debug Ergebnis
    result[0] = 14541
    // Test, ob man mit diesen Zahlen rechnen kann
    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

Autor: Bernd (Gast)
Datum:

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

Autor: Ahem (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
    rxbuffer[0] = 0x02;
    rxbuffer[1] = 0x03;
    rxbuffer[2] = 0x03;
    rxbuffer[3] = 0x03;

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

Guck mal in eine ASCII-Tabelle Deiner Wahl!

Autor: Helmut Lenzen (helmi1)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Philipp Burch (philipp_burch)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Bernd (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Zusammen,

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

Autor: Roland Praml (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
    // Debug Ergebnis
    result[0] = 14541
    // Test, ob man mit diesen Zahlen rechnen kann
    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

Autor: Sven P. (haku) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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...

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.