Arduino Forum

International => Deutsch => Topic started by: Zebra on Jun 14, 2012, 02:05 pm

Title: Serielle Daten ASCII mit 7-Bit
Post by: Zebra on Jun 14, 2012, 02:05 pm
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?


Code: [Select]

#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!
Title: Re: Serielle Daten ASCII mit 7-Bit
Post by: mikeZ337 on Jun 14, 2012, 08:28 pm
hallo

Welche Version der IDE verwendest du. Wenn 1.0 oder neuer, was ist der Sinn der Zeile
Code: [Select]
Serial1.flush();

Mit der Funktion read() wird ein Byte vom Eingangsbuffer gelesen und danach gleich gelöscht.
Code: [Select]
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

Code: [Select]

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
Title: Re: Serielle Daten ASCII mit 7-Bit
Post by: Zebra on Jun 15, 2012, 09:24 am
Hallo,


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. :) Flush geht nur für ausgehende Daten.


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.



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
Title: Re: Serielle Daten ASCII mit 7-Bit
Post by: uwefed on Jun 15, 2012, 10:56 am
Wenn Du die Bitfolge umdrehst stimmt wenigstens die Hälfte der Zeichen:

1101010      0101011   +

Grüße Uwe
Title: Re: Serielle Daten ASCII mit 7-Bit
Post by: Zebra on Jun 15, 2012, 11:03 am
Hallo Uwe,


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
Title: Re: Serielle Daten ASCII mit 7-Bit
Post by: mikeZ337 on Jun 15, 2012, 04:22 pm
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. :~
Title: Re: Serielle Daten ASCII mit 7-Bit
Post by: Zebra on Jun 15, 2012, 09:32 pm

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....