Serielle Daten ASCII mit 7-Bit

Hallo,

ich möchte die Daten eines Messchiebers (Helios Digit) einlesen. Die Schnittstelle hat eher unübliche Einstellungen. 4800,E,7,1 Die Einstellungen habe ich direkt ins Register von meinem MEga2650 geschrieben. Eine Abfrage zeigt das positive Ergebnis an.
Der Datensatz besteht aus 9 Zeichen. Vorzeichen, 4 Digits, Dezimalpunkt, 2 Digits, CR.
Deswegen lasse ich auch das Programm warten bis alle 9 Zeichen da sind.
Wenn ich nun die Zeichen auf dem Display oder auch im Serial-Monitor anschaue, dann haben sie nichts mit den gesendeten Zeichen zu tun. Statt "+0000.00" empfange ich "6 52 19 106"

Nun ist meine Vermutung dass es an der Wortlänge liegen kann. Hat jemand einen Tip?

#include <LiquidCrystal.h>

// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

void setup(){
    // set up the LCD's number of columns and rows: 
  lcd.begin(24, 2);
  // initialize the serial communications:
  Serial1.begin(4800);
  // Baud wie oben aber mit E,7,1
  UCSR1C = (0<<UMSEL11) | (0<<UMSEL10) | (1<<UPM11) | (0<<UPM10) | (0<<USBS1) | (1<<UCSZ11) | (0<<UCSZ10) |(0<<UCPOL1);
  Serial.begin(9600);
  }


void loop()
{
  // when characters arrive over the serial port...
  if (Serial1.available() >=9) {
    // wait a bit for the entire message to arrive
    //delay(100);
    // clear the screen
     lcd.clear();
    // read all the available characters
    // display each character to the LCD
      lcd.write(Serial1.read());      
      Serial.println(Serial1.read());
      Serial1.flush();
  } 
}

Vielen Dank!

hallo

Welche Version der IDE verwendest du. Wenn 1.0 oder neuer, was ist der Sinn der Zeile

Serial1.flush();

Mit der Funktion read() wird ein Byte vom Eingangsbuffer gelesen und danach gleich gelöscht.

lcd.write(Serial1.read());      
Serial.println(Serial1.read());

damit geht ein Byte an das lcd, wird vom Eingangsbuffer gelöscht und das nächste Byte geht an Serial und wird vom Eingangsbuffer gelöscht

Was auch noch etwas unklar ist, ob die übertragenen Zeichen ASCII Kodiert sind

Ich würde ein einfaches Programm starten, das dir alle Daten des Messchiebers an den PC weitergibt. An diesem kannst du sie dir mit dem Serial Monitor anzeigen lassen

void loop()
{
  if (Serial1.available() > 0) {     
      Serial.println(Serial1.read(),DEC);
  } 
}

Jede Zeile ist ein Byte.
Mit der ASCII Tabelle kannst du noch überprüfen, ob die Daten ASCII Kodiert sind

http://www.tcp-ip-info.de/tcp_ip_und_internet/ascii.gif

Hallo,

thewknd:
Welche Version der IDE verwendest du. Wenn 1.0 oder neuer, was ist der Sinn der Zeile

Du hast natürlich recht. Dieses war eine Verzweiflungstat. :slight_smile: Flush geht nur für ausgehende Daten.

thewknd:
Mit der Funktion read() wird ein Byte vom Eingangsbuffer gelesen und danach gleich gelöscht.

Ok. Mein Fehler. Danke für den Tip. In meinem eigentlichen Programm fülle ich erstmal ein Array und das kann ich ja dann beliebig ausgeben.

thewknd:
Was auch noch etwas unklar ist, ob die übertragenen Zeichen ASCII Kodiert sind

Ich würde ein einfaches Programm starten, das dir alle Daten des Messchiebers an den PC weitergibt. An diesem kannst du sie dir mit dem Serial Monitor anzeigen lassen

Das hab ich dann mal getan. Als DEC kam da nichts vielsagendes raus, ausser dass es nun wirklich 9 Zeichen sind. So richtig spannend wird es allerdings BINÄR. Ich habe den Wert "+0012.34CR" übertragen und bekam folgende Ausgabe im Monitor:

1101010
110
110
100111
10011
110100
1100110
1001
111001

Ich fülle ich mal die Tabelle mit Nullen auf und schreibe die Sollwerte dazu:
1101010 00101011 +
0000110 00110000 0
0000110 00110000 0
0100111 00110001 1
0010011 00110010 2
0110100 00101100 ,
1100110 00110011 3
0001001 00110100 4
0111001 00001101 CR

Ich finde nun nur keine Lösung. Egal ob ich nur Verschiebe, drehe oder invertiere - ich komme nicht generell auf das Zeichen.

Mal prinzipiell: In Hyperterminal geht natürlich alles. Auch ein Portsniffer zeigt das richtige an.

Habe ich vielleicht irgendein Problem wegen den 7-Bit?

Grüße

Wenn Du die Bitfolge umdrehst stimmt wenigstens die Hälfte der Zeichen:

1101010 0101011 +

Grüße Uwe

Hallo Uwe,

uwefed:
Wenn Du die Bitfolge umdrehst stimmt wenigstens die Hälfte der Zeichen:

1101010 0101011 +

Ja. Ein Teil der Zeichen könnte man so vielleicht hinbekommen.
Ich meine... ich kann es mir nun "quick and dirty" machen. Ich hinterlege einfach ein "Table", denn ich habe ja nur zwei Vorzeichen, 10 Ziffern, Komma und CR die kommen können. Ich kann nun sagen wenn das zeichen B1101010 kommt dann mach daraus B0101011.

Aber ich bin ein Mensch der gerne versteht. Warum geht hier was schief? Ist das einfach eine unzulänglichkeit in Arduino? Kann der einfach kein 7-Bit-Ascii?

Grüße Jens

hmmmm

aber du schreibst, dass im Hyperterminal alles ok ist...
Wenn du die genannten "+0012.34CR" überträgst, kommen dann immer die selben falschen Bytes an?

Die Bits in UCSR1C sind auch richtig gesetzt. Baudrate sollte auch korrekt eingestellt sein. :~

thewknd:
hmmmm

aber du schreibst, dass im Hyperterminal alles ok ist...
Wenn du die genannten "+0012.34CR" überträgst, kommen dann immer die selben falschen Bytes an?

Ja. Es kommen immer die gleichen falschen Bytes an. Es kann als nix sein was mit "shiften" o.Ä. zu tun haben kann. Ich hab schon angefangen die oberen 4 Bits gegen die unteren zu tauschen. Diese "Halbbytes" auch noch einzeln zu drehen, etc. Wenn dann mal eine Methode für ein bis zwei Ziffern stimmt, kommt wieder eines daher was gar nicht stimmt. Ich kann gerne mal alle relevanten Zeichen posten. Aber ich denke hier ist ein klitzekleiner Logikfehler. Irgendwas übersehe ich....