Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

Arduino -> Daten einlesen

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC.
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
DJS2009



Anmeldungsdatum: 07.11.2009
Beiträge: 22
Wohnort: Hagen / Westf.

BeitragVerfasst am: 23.02.2010, 20:15    Titel: Arduino -> Daten einlesen Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Sebastian
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 5969
Wohnort: Deutschland

BeitragVerfasst am: 23.02.2010, 20:40    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
DJS2009



Anmeldungsdatum: 07.11.2009
Beiträge: 22
Wohnort: Hagen / Westf.

BeitragVerfasst am: 24.02.2010, 09:56    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
MisterD



Anmeldungsdatum: 10.09.2004
Beiträge: 3071
Wohnort: bei Darmstadt

BeitragVerfasst am: 24.02.2010, 13:10    Titel: Antworten mit Zitat

wie wärs mit ...
Code:

LINE INPUT #1, Zeile
IF Zeile <> "" THEN Print #2, Zeile


Zunge rausstrecken
_________________
"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
Benutzer-Profile anzeigen Private Nachricht senden
DJS2009



Anmeldungsdatum: 07.11.2009
Beiträge: 22
Wohnort: Hagen / Westf.

BeitragVerfasst am: 24.02.2010, 14:26    Titel: Antworten mit Zitat

Super - Danke für den Tipp Zunge rausstrecken

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

geschockt hat jetzt aber irgendwie auch nix gebracht
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
DJS2009



Anmeldungsdatum: 07.11.2009
Beiträge: 22
Wohnort: Hagen / Westf.

BeitragVerfasst am: 25.02.2010, 16:33    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC. Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.

 Impressum :: Datenschutz