Hallo zusammen,
Ich sitze immer noch an meinem kleinen Programm und bin fast fertig. Ich
habe mir in Anlehnung an Andreas Beispiele ein paar eigene
Unterprogramme erstellt und kann nun die Vectordaten ordentlich
auslesen. Auch habe ich einen Beispielcode von der PiGPIO- Webseite für
das Auslesen eines Drehencoders, was auf dem "callback"- Prinzip basiert
angepasst und noch den Druckschalter des Encoder und den Sensoreingang
für den Ein-/Ausschalter zum Herunterfahren des PI hinzugefügt.
Funktioniert ganz gut und ich kann nun das rudimentäre Menü bedienen.
Leider verbleibt noch ein Problem:
Ich lasse eine Schleife laufen, die per "gpioSerialRead" einen
Ultraschallsensor am UART-Port abfragt. Es ist ein Maxbotics
Sonar-Sensor, der nach Anlegen der Spannungsversorgung ohne weiteres
Zutun auf der RX-Leitung den gemessenen Abstand sendet. Es wird immer
"R123\CR" (R- Range, 123- 3-stelliger Wert in cm, \CR- Carriage-return)
gesendet.
Nun funktioniert meine Routine grundsätzlich, aber ich bekomme, wenn ich
mir den "read_buff" ausgeben lasse immer wieder so was:R105��v5
Je nach "Sleep"-Zeit in der Schleife verändert sich das und ich bekomme
leere Antworten oder anderes "Kauderwelsch" oder auch nur Teile (z.B.
"R1", "05R1" usw.) des 5-bit langen Wertes. Wenn ich zur gleichen Zeit
mit "minicom -D /dev/serial0 -b 9600" auf den Sensor bzw. dessen Ausgabe
ansehe, dann funktioniert das problemlos. Es muss also an meinem Code
liegen!
Auch mit Blick auf den Code des Drehencoders stellen sich mir nun mal
wieder ein paar Fragen:
1. Liegt das an der zeitlichen Abstimmung des Auslesens meiner Schleife?
Wie muss ich das auf die Baudrate von "9600" abstimmen?
2. Es kommen neue Werte nur mit Verzögerung (wenn ich z.B. meine Hand
vor den Sensor halte), bei "minicom" nicht. Hab ich da ein Problem mit
einem Puffer?
3. zu 2.: Kann ich den seriellen Puffer vor dem Lesen löschen, um immer
nur "frische" Werte zu bekommen?
4. oder ist es besser, wenn ich das nicht mit einer "Endlosschleife"
mache, sondern mit einer Callback-Funktion mache, die bei einem neuen
Wert getriggert wird (aber wie könnte so was aussehen, beim Encoder wird
das ja durch die Funktion "gpioSetAlertFuncEx" getriggert, wenn ich das
richtig verstehe....)?
Mein problematischer Code sieht so aus:
------------------------
while( i < num_samples && j < num_samples + 50 )
{
memset(&read_buf, '\0', sizeof(read_buf));
rx_stat_bytes = gpioSerialRead(RXD, read_buf,
sizeof(read_buf));
cout << " rx_stat: " << rx_stat_bytes << " readbuf: " <<
sizeof(read_buf) << endl;
cout << read_buf << endl;
if ( rx_stat_bytes > 0 )
{
if( memcmp ( read_buf, "R",
sizeof(read_buf) ) == 1 )
{
r_value.push_back(atoi(read_buf+1));
i++;
}
}
else
{
// printf("Sensor aus?\n");
}
j++;
usleep(1000);
}
------------------------
Eine Ausgabe der cout-"debug"-Zeile ist:
----------------------
rx_stat: 5 readbuf: 5
��v5
rx_stat: 5 readbuf: 5
��v5
rx_stat: 5 readbuf: 5
��v5
rx_stat: 5 readbuf: 5
��v5
rx_stat: 5 readbuf: 5
��v5
rx_stat: 5 readbuf: 5
��v5
rx_stat: 5 readbuf: 5
��v5
rx_stat: 1 readbuf: 5
R
rx_stat: 3 readbuf: 5
105
rx_stat: 1 readbuf: 5
rx_stat: 5 readbuf: 5
8�v0
rx_stat: 5 readbuf: 5
8�v0
rx_stat: 5 readbuf: 5
8�v0
rx_stat: 5 readbuf: 5
8�v0
rx_stat: 5 readbuf: 5
8�v0
rx_stat: 0 readbuf: 5
rx_stat: 0 readbuf: 5
rx_stat: 0 readbuf: 5
rx_stat: 0 readbuf: 5
rx_stat: 0 readbuf: 5
rx_stat: 0 readbuf: 5
rx_stat: 0 readbuf: 5
rx_stat: 0 readbuf: 5
rx_stat: 0 readbuf: 5
rx_stat: 0 readbuf: 5
rx_stat: 0 readbuf: 5
rx_stat: 0 readbuf: 5
rx_stat: 0 readbuf: 5
rx_stat: 0 readbuf: 5
rx_stat: 0 readbuf: 5
rx_stat: 0 readbuf: 5
rx_stat: 0 readbuf: 5
rx_stat: 1 readbuf: 5
R
rx_stat: 0 readbuf: 5
rx_stat: 1 readbuf: 5
1
rx_stat: 1 readbuf: 5
2
rx_stat: 1 readbuf: 5
0
rx_stat: 1 readbuf: 5
rx_stat: 0 readbuf: 5
rx_stat: 0 readbuf: 5
r_value_mean:120
----------------------
Das Blöde ist, das ich bis Montag 6.30Uhr dafür eine Lösung brauche, das
dann Abgabe ist :-(
Wäre schön, wenn ihr mich noch mal "erleuchten" könntet.
--
Mit freundlichen Grüßen
Sebastian Reinhardt
LMV
Landmaschinenvertrieb- und Service GmbH
Hauptstrasse 13G
(OT Hartmannsdorf)
01762 Hartmannsdorf- Reichenau
Geschäftsführer: Sebastian Reinhardt
Amtsgericht: Dresden
Handelsregisternummer: HRB 2574
Umsatzsteuer- Identnr.: DE 140461622
Tel: +49 373 26 1851
Mobil:+49 172 357 3107
Fax: +49 373 26 86804
Mail: s...@lmv-hartmannsdorf.de
Web: www.lmv-hartmannsdorf.de