Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
DJS2009
Anmeldungsdatum: 07.11.2009 Beiträge: 22 Wohnort: Hagen / Westf.
|
Verfasst am: 23.02.2010, 20:15 Titel: Arduino -> Daten einlesen |
|
|
Hallo,
ich brauche mal einen Tipp was das Einlesen und Verarbeiten von Daten über den Com-Port angeht..
Ein Ardunio gibt über seine USB-Schnittstelle Texte aus in der Form
"Schalter 1 an"
"Schalter 1 aus"
"Sensor1 23.15 C"
Ich möchte diese Texte nun in FB einlesen, mit Datum und Uhrzeit versehen und abspeichern.
Lösungsansatz:
Com-Port öffen
In einer Endloschleife Line input #1
Mit Date und Time ergänzen und in einer TXT-Datei #2 abspeichern.
Funktioniert ohne Probleme, aber da die Daten nur sporadisch vom Arduino kommen wird trotzdem jeder Umlauf mitgeschrieben - Als ich versucht habe, nur dann speichern zu lassen wenn sich in der eingelesen Zeile Text befinden, kommt es zum "Zerreissen" der nachfolgenden Nachrichten, weil die Übertragung kein Handshake hat und während FB die Zeilen prüft, gehen ihm die einlaufenden Infos wohl verloren.
Hat jemand einen Vorschlag, wie man das ausregeln könnte?
Wäre der Befehl Wait eine Alternative? Und wenn ja in welcher Form?
Gruß
Dirk |
|
Nach oben |
|
 |
Sebastian Administrator

Anmeldungsdatum: 10.09.2004 Beiträge: 5969 Wohnort: Deutschland
|
Verfasst am: 23.02.2010, 20:40 Titel: |
|
|
Hallo,
verstehe ich das richtig, dass die Daten vom Mikrocontroller in so schneller Abfolge gesendet werden, dass bereits durch das Ausführen weniger Stringoperationen nach dem Abfragen eine zu große Pause zwischen zwei Abfragen entsteht, durch die Daten verloren gehen?
Gängige COM-Port-Schnittstellenbausteine wie der 16550 verfügen für zeitkritische Datenübertragungen über einen FIFO-Puffer. Wie das bei der eingesetzten USB-COM-Lösung aussieht (Verwendest du einen USB->RS232-Adapterstecker oder ist auf dem µC-Board ein USB-Baustein drauf?), müsste man mal in Erfahrung bringen.
Ein softwaremäßig implementierter Puffer könnte andernfalls vielleicht Abhilfe schaffen. In einem Programmthread könntest du ständig per Endlosschleife Daten von der Schnittstelle auslesen, in eine Queue einreihen und ein anderer nebenläufiger Thread würde die Daten aus der Queue abholen, auswerten und ggf. speichern.
Du könntest aber auch mal deinen Code zeigen, bei dem die Nachrichten "zerrissen" werden. Vielleicht kann man da etwas optimieren.
Viele Grüße!
Sebastian _________________
Die gefährlichsten Familienclans | Opas Leistung muss sich wieder lohnen - für 6 bis 10 Generationen! |
|
Nach oben |
|
 |
DJS2009
Anmeldungsdatum: 07.11.2009 Beiträge: 22 Wohnort: Hagen / Westf.
|
Verfasst am: 24.02.2010, 09:56 Titel: |
|
|
Die Verbindung zwischen dem Arduino und PC erfolgt per USB Kabel ohne weiteren Adapter. Geschwindigkeit liegt bei 9600 Baud
Die Abfolge der Text erfolgt im Moment alle 2 Sekunden.
Zum Code selbst:
wenn ich
Code: |
LINE INPUT #1, Zeile
Print #2, Zeile
|
in einer Schleife laufen lasse funktioniert das - allerdings schreibt FB dann logischerweise auch die "Leerzeile" mit
Wenn ich
Code: |
IF ASC(MID(Zeile,1,1)) <> 0 THEN
Print #2, Zeile
ENDIF
|
verwende habe ich bereits Probleme und Teile der Zeile werden verschluckt
Aus Test
wird dann so was wie
Test
Tes
t
Test
Ich werde heute versuchen , einen anderen Serial-Treiber beim Arduino zu verwenden bzw. das FB-Programm als exe laufen zu lassen.
Gruß
Dirk
Nachtrag vom 24.02.2010 11:46
Aus als exe und mit Einsatz eines anderen Treibers auf der Arduino Seite keine Änderungen. |
|
Nach oben |
|
 |
MisterD

Anmeldungsdatum: 10.09.2004 Beiträge: 3071 Wohnort: bei Darmstadt
|
Verfasst am: 24.02.2010, 13:10 Titel: |
|
|
wie wärs mit ...
Code: |
LINE INPUT #1, Zeile
IF Zeile <> "" THEN Print #2, Zeile
|
 _________________ "It is practically impossible to teach good programming to students that have had a prior exposure to BASIC: as potential programmers they are mentally mutilated beyond hope of regeneration."
Edsger W. Dijkstra |
|
Nach oben |
|
 |
DJS2009
Anmeldungsdatum: 07.11.2009 Beiträge: 22 Wohnort: Hagen / Westf.
|
Verfasst am: 24.02.2010, 14:26 Titel: |
|
|
Super - Danke für den Tipp
Das ist übrigens das Ergebnis in der Datei #2:
Sensors found:
2
0 22.
4
1 22.62
0 22.87
1 22.62
0 22.87
1
2.62
0
22.87
1 22.
2
0 22.
4
1 22.62
0 22.87
22.62
0 22.94
1 2
.62
0
2.87
1 22.6
0 22.9
1 22.62
0 22.94
22.62
hat jetzt aber irgendwie auch nix gebracht |
|
Nach oben |
|
 |
DJS2009
Anmeldungsdatum: 07.11.2009 Beiträge: 22 Wohnort: Hagen / Westf.
|
Verfasst am: 25.02.2010, 16:33 Titel: |
|
|
Vielleicht kann mich jemand unterstützen, dass für FB umzusetzen:
Nachfolgendes stammt aus einem Arduino Forum, wo man ähnliche Probleme hatte, allerdings mit VB.net.
Zitat:
Here is what I would do, for a simple protocol marking the beginning and ending of the block:
on the arduino:
Code:
Serial.print("!");
Serial.print("Something to send.\r\n");
on the Pc, here is the pseudo code: (I will leave it for you to code up...)
- check our local data buffer. if there isn't a '\r\n' there, continue.
- read the serial buffer, append any data there to our local buffer
- check our local data buffer. if there is a '!', we have a block.
- do whatever with the block of data between '!' and '\r\n'
- remove the block from our local buffer, and go back to the top
On your advice I've marked the beginning and ending of my message:
Start : <START>
End: <END>
Example:
Serial.print("<START>It's Alive....Alive<END>")
This works great for sending data from the arduino to my PC.
Pseudo code (VB .NET Alert!!):
if ComPort.Readto("<START>") is true then
Msg = Comport.Readto("<END>") '
end if
TextBox.Text = Msg
Zitat Ende.
Gruß
Dirk |
|
Nach oben |
|
 |
|