Daten seriell lesen und speichern

Anfängerfragen zum Programmieren mit PureBasic.
derschutzhund
Beiträge: 328
Registriert: 06.06.2013 20:37
Computerausstattung: Satellite A210-19Z, Samsung Netbook N130, VPAD10

Daten seriell lesen und speichern

Beitrag von derschutzhund »

Hallo zusammen,

irgendwie stehe ich gerade richtig auf dem Schlauch und weiß nicht wie ich da runterkomme!
Ein Arduino liest einen Beschleunigungssensor aus und liefert im Abstand von 10ms die Werte der drei Achsen + einem Zähler über die Com an den PC.
Die 4 Zahlen werden als Byte vom Arduino gesendet.
Im Terminal sieht das dann so aus:
----------------------
2,331,341,278
3,331,341,278
4,331,341,278
5,331,341,278
6,330,341,277
7,330,341,278
8,330,341,277
9,330,340,278
10,331,341,277
11,331,340,277
12,330,341,277
13,330,340,277
14,330,341,277
15,330,341,277
16,331,341,278
17,330,341,278
-----------------------
Mein PB-Prog soll diese Daten kontinuierlich lesen und zunächst in einer Textdatei abspeichern damit die Daten später ausgewertet werden können.
Im Augenblick schaffe ich es nicht die Daten durchgehend zu lesen und testweise mit AddGadgetItem(Editor_0,-1,text) in einem Fenster anzuzeigen.
Was ich auch nicht hinbekomme ist das Programm mit einem Button sauber zu schließen.
Vielleicht kann mir da mal jemand auf die Sprünge helfen?
LG
Wolfgang
Satellite A210-19Z, Samsung N130, VPAD10, WinXP, Win7, PuppyLinux, PB 5.24, 5.31. 5.70
Elektronik, Mikrocontroller, CNC-Technik, 3D-Druck
Benutzeravatar
Macros
Beiträge: 1361
Registriert: 23.12.2005 15:00
Wohnort: Olching(bei FFB)
Kontaktdaten:

Re: Daten seriell lesen und speichern

Beitrag von Macros »

Ich hab dir mal ein kleines Beispiel zu deinen Fragen gebastelt.
Wenn es dir nicht ausführlich genug kommentiert ist, dann melde dich einfach.

Der Generator, er spielt sozusagen deinen Arduino vor

Code: Alles auswählen

; Pair of virtual COM Ports created with 
; socat -d -d pty,raw,echo=0 pty,raw,echo=0
; (Linux)


If OpenSerialPort(1,"/dev/pts/18",115200,0,8,1,0,1024,1024) = 0
  Debug "Fehler beim COM Port öffnen"
  End
EndIf

Repeat
  Delay(10)
  zaehler+1
  string$=Str(zaehler)
  For a=1 To 3
    string$+","+Str(Random(899)+100)
  Next
  Debug string$
  WriteSerialPortString(1,string$+#LF$)
Until GetClipboardText()="q"

CloseSerialPort(1)
Und der eigentliche Teil, das Programm mit Fenster, Editorgadget und Dateispeicherung,

Code: Alles auswählen

; Virtual COM Ports created with 
; socat -d -d pty,raw,echo=0 pty,raw,echo=0
; (Linux)

Define einzelzeichen$ ; Speichert einzelnzeichen beim einlesen
Define zeile$="" ; speichert aktuelle Zeile
Define Dateipfad$="/home/macros/ram/test.txt"

; der einfachkeit halber für alles Fenster, Gadget, Datei den Index 1 weil wir jeweils nur eines haben.
If OpenSerialPort(1,"/dev/pts/19",9600,0,8,1,0,1024,1024)=0
  Debug "Fehler beim COM Port öffnen"
  End
EndIf
If CreateFile(1,Dateipfad$)=0
  Debug "Fehler beim Datei erstellen!"
  End
EndIf

OpenWindow(1,0,0,800,600,"COM Test",#PB_Window_SystemMenu|#PB_Window_ScreenCentered)
EditorGadget(1,0,0,800,600)
einzelzeichen$=Space(1)

; Programmschleife / Hauptschleife
Repeat
  ; Wir warten maximal 5ms auf ein Event, damit wir die Nachrichten die alle 10ms kommen verarbeiten können
  event=WaitWindowEvent(5) 
  
  bytes_available = AvailableSerialPortInput(1)
  If bytes_available
    
    For a=1 To bytes_available
      ReadSerialPortData(1,@einzelzeichen$,1)

      If einzelzeichen$=#LF$ ; Zeilenumbruch!
        ; Ausgeben an die zwei Sachen
        AddGadgetItem(1,-1,zeile$)
        WriteStringN(1,zeile$)
        
        ;Wir sorgen dafür, dass das Gadget nicht überläuft
          If CountGadgetItems(1)=20
            RemoveGadgetItem(1,0) ; Zählung beginnt bei 0
          EndIf
        
        ; Zeile wieder leer
        zeile$=""
      Else
        ; Sonst an die Zeile anhängen
        zeile$+einzelzeichen$
      EndIf
    Next
    
  EndIf
  
; Wir beenden die Hauptschleife, wenn das X im Fenster gedrückt wird
Until event=#PB_Event_CloseWindow

; Aufräumen 
CloseFile(1)
CloseSerialPort(1)
CloseWindow(1)
Mir ist noch aufgefallen, dass du sagst
AddGadgetItem(Editor_0,-1,text)
Zu einem Editorgadget kannst du nichts mit AddGadgetItem hinzufügen, oder .. doch das geht?
Danke jetzt hab ich auch was gelernt :) Praktisch!

(Hatte im Beispiel oben zuerst ein Listviewgadget, bevor ich deine Frage nochmal gelesen hab)
Bild
derschutzhund
Beiträge: 328
Registriert: 06.06.2013 20:37
Computerausstattung: Satellite A210-19Z, Samsung Netbook N130, VPAD10

Re: Daten seriell lesen und speichern

Beitrag von derschutzhund »

Hallo Macros,
erst mal vielen Dank, habe das Prog. etwas auf Windows geändert und jetzt läufts.
Im nächsten Schritt muss ich nun aus den digitalen Werten der drei Achsen die Beschleunigungen berechnen und dann eine grafische Anzeige am Bildschirm erzeugen.
LG
Wolfgang
Satellite A210-19Z, Samsung N130, VPAD10, WinXP, Win7, PuppyLinux, PB 5.24, 5.31. 5.70
Elektronik, Mikrocontroller, CNC-Technik, 3D-Druck
Antworten