Wo ist mein Denkfehler ?

OP #2133307
Lesenswert?

Hallo,

ich lese über RS232 einen String ein *1200, dann wandle ich in int um
1
ext_offset=((rx_buffer[1]-48)*1000) + ((rx_buffer[2]-48)*100)
2
        + ((rx_buffer[3]-48)*10) + ((rx_buffer[4]-48)*1) ;  // ASCII in Int wandeln

Meine Variable hat dann aber nur den Wert 1152, also 48 zu wenig,
wo ist der Denkfehler ?

Gruß
Christian
#2133310
Lesenswert?

Christian St. schrieb:
> Hallo,
>
> ich lese über RS232 einen String ein *1200, dann wandle ich in int um
>
1
ext_offset=((rx_buffer[1]-48)*1000) + ((rx_buffer[2]-48)*100)
2
>         + ((rx_buffer[3]-48)*10) + ((rx_buffer[4]-48)*1) ;  // ASCII in
3
> Int wandeln
>
> Meine Variable hat dann aber nur den Wert 1152, also 48 zu wenig,
> wo ist der Denkfehler ?

Nirgends.
Du hättest auch atoi nehmen können, aber das ist ein anderes Thema.

Ist sichergestellt, dass du auch tatsächlich den String "*1200" 
empfängst? Hast du das kontrolliert? Die Antwort "Ja, weil ich den 
Sendecode kenne" lasse ich dabei nicht gelten. Hast du dir den String, 
so wie er empfangen wurde, ausgeben lassen?
Woher weißt du, dass die Berechnung 1152 ergibt?
#2133365
Lesenswert?

Christian St. schrieb:

> da sitzt man manchmal davor wie blöd......

Die Lektion lautet:

In der Kette

  Eingabe - Verarbeitung - Ausgabe

kann der Fehler überall sein.
Also überprüft man zuerst das was am einfachsten geht: die Eingabe.

Denn wenn ein Verfahren schon mit falschen Daten gefüttert wird, kann 
hinten nichts richtiges mehr rauskommen.

Während der Entwicklung nichts als korrekt annehmen, solange man sich 
nicht davon überzeugt hat. Das betrifft auch Daten, die von extern 
eingespeist werden.
OP #2133384
Lesenswert?

tja, manchmal verrennt man sich :-)

mit ein Problem war HTerm, da gibt man erst die Zeichenkette an und 
sendet
mit Return. HTerm funzt auch nicht wirklich unter Win7

Hab ne alte Kiste mit winn2000 und Hyperterminal rausgekramt und da wird
jedes Zeichen sofort gesendet, dadurch ist mir augefallen das nach dem 4 
Zeichen schon das <OK> von meinen System kam.

Gibt es für Win7 überhaupt ein gescheites Terminalprogramm ?

Hab schon hier im Forum und bei Google gesucht, aber nix brauchbares 
gefunden

HTerm mochte ich geht aber unter win7 nur machmal im 
Kompatibilitätsmodus
und schmiert des öfteren ab, blockiert sich selbst den ComPort.
#2133390
Lesenswert?

Christian St. schrieb:

> Hab ne alte Kiste mit winn2000 und Hyperterminal rausgekramt und da wird
> jedes Zeichen sofort gesendet, dadurch ist mir augefallen das nach dem 4
> Zeichen schon das <OK> von meinen System kam.

Drum macht man solche Sachen auch selten mit fixen Zeichenzahlen.
ASCII Übertragung funktioniert am besten, wenn weder Sender noch 
Empfänger auf irgendwelche Zeichenzahlen aufpassen müssen.
Ein Weg dazu ist zb das abschliessen einer Eingabe mit "Return" (\n)

Der Empfänger fügt so lange eine weitere Stelle zur Zahl hinzu, solange 
er Ziffern in der Eingabe sieht. Kommt der Return, dann ist die Eingabe 
fertig. Getreu dem Motto

  while( isDigit( nextCharacter ) ) {
    Zahl = 10 * Zahl + nextCharacter - '0';
    receive next Character
  }

(wie auch immer dann der Teil receive next Character auch aussieht)

Mit solch fix vorgeschriebenen Zeichenzahlen schiesst man sich gerne 
selber mal ins Knie, ohne etwas dafür zu kriegen.

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