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();
}
}
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
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. 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:
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?
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. :~
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....