Forum: Mikrocontroller und Digitale Elektronik Wo ist mein Denkfehler ?


von Christian S. (chris-st)


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

von Karl H. (kbuchegg)


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?

von Christian S. (chris-st)


Lesenswert?

1152 weis ich weil ich high- und lowbyte ins EEProm schrein und dann 
auslese.
Das mit dem Ausgeben des Strings mach ich mach ich jetzt gleich mal.

von nachdenklicher (Gast)


Lesenswert?

> 1152 weis ich weil ich high- und lowbyte ins EEProm schrein und dann

Und die restlichen 2 Byte nicht kontrolliert?

Joe

von Christian S. (chris-st)


Lesenswert?

Hab meine Dummheit gefunden.
1
rx_buffer[cnt++] = Uart1_Read(); //  Zeichen in Buffer und cnt erhöhen
bin bei cnt=4 schon in die Berechnung rein, dabei geht das letze Zeichen
unter, da der Buffer mit Nullen gefüllt ist ist 0-48 logisch -48.

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

von Karl H. (kbuchegg)


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.

von Christian S. (chris-st)


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.

von Karl H. (kbuchegg)


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.

von Christian S. (chris-st)


Lesenswert?

ist mir schon klar,
hier geht es nur um einen Wert, der auch nur vom Servicetechniker 
einmalig
eingestellt wird.
Da reicht "quick and dirty"  :-)

Danke für die Unterstützung
Gruß
Christian

von Thomas E. (thomase)


Lesenswert?

Christian St. schrieb:
> Da reicht "quick and dirty"  :-)

Gewöhn' dir so 'nen Scheiß gar nicht erst an.

mfg.

von Karl H. (kbuchegg)


Lesenswert?

Christian St. schrieb:
> ist mir schon klar,
> hier geht es nur um einen Wert, der auch nur vom Servicetechniker
> einmalig
> eingestellt wird.
> Da reicht "quick and dirty"  :-)

noch quicker als

  ext_offset = atoi( &rx_buffer[1] );

kann ich mir dann eigentlich nicht vorstellen :-)

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.