Serielle Schnittstelle auslesen...

Anfängerfragen zum Programmieren mit PureBasic.
SBond
Beiträge: 266
Registriert: 22.05.2013 20:35

Re: Serielle Schnittstelle auslesen...

Beitrag von SBond »

mal ganz ganz grob....

Code: Alles auswählen

*DeinPuffer = AllocateMemory(1000000) ; 1 MB Speicher für die Daten reservieren


Anzahl_Bytes_im_Puffer.i = AvailableSerialPortInput(#SerialPort)
If (Anzahl_Bytes_im_Puffer > 0)
	
	; alle verfügbaren Daten im COM-Eingangspuffer auslesen (Binär)
	ReadSerialPortData(#SerialPort, *DeinPuffer, Anzahl_Bytes_im_Puffer)
	
	; Die gelesenen Daten als String in die Variable schreiben
	Deine_Daten$ = PeekS(*DeinPuffer, Anzahl_Bytes_im_Puffer, #PB_Ascii)
	
	; ... Deine_Daten$ parsen ...
	
EndIf
die Anzahl der Daten, die du auslesen möchtest, kannst du leicht variieren. Schau die mal: PeekS() und ReadSerialPortData() in der PB-Hilfe an, wenn du nicht sicher bist, was die einzelnen Parameter machen.

Wenn ich das richtig sehe, dann sieht dein Datenstrom ungefähr so aus: ..... 12.0011.9812.0212.0512.0011.94 .....
Wenn der Datenstrom so bleibt und immer 5 Bytes pro Wert gesenet werden, dann lässt es sich gut parsen.
41 6c 73 6f 20 77 65 6e 6e 20 64 75 20 73 6f 20 76 69 65 6c 20 4c 61 6e 67 65 77 65 69 6c 65 20 68 61 73 74 2c 20 64 61 6e 6e 20 6b 61 6e 6e 73 74 20 64 75 20 61 75 63 68 20 67 6c 65 69 63 68 20 7a 75 20 6d 69 72 20 6b 6f 6d 6d 65 6e 20 75 6e 64 20 61 62 77 61 73 63 68 65 6e 2e

:D
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Serielle Schnittstelle auslesen...

Beitrag von ts-soft »

Guck Dir doch den Datenstrom einfach mal an:

Code: Alles auswählen

EnableExplicit

Define *DeinPuffer, Anzahl_Bytes_im_Puffer

; hier anpassen!
If OpenSerialPort(0, "COM1", 300, #PB_SerialPort_NoParity, 8, 1, #PB_SerialPort_NoHandshake, 1024, 1024)
 
  Anzahl_Bytes_im_Puffer.i = AvailableSerialPortInput(0)
 
  If Anzahl_Bytes_im_Puffer > 0
    *DeinPuffer = AllocateMemory(Anzahl_Bytes_im_Puffer)
   
    ; alle verfügbaren Daten im COM-Eingangspuffer auslesen (Binär)
    If ReadSerialPortData(0, *DeinPuffer, Anzahl_Bytes_im_Puffer)
      ShowMemoryViewer(*DeinPuffer, Anzahl_Bytes_im_Puffer); hier prüfen, was ankommt!
      CallDebugger
    EndIf
   
  EndIf
 
  CloseSerialPort(0)
EndIf 
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
The_Dark_Zim-.-
Beiträge: 372
Registriert: 18.03.2008 16:53

Re: Serielle Schnittstelle auslesen...

Beitrag von The_Dark_Zim-.- »

Also ich mach das in etwa so:

Code: Alles auswählen

Enumeration
  #SerialPort
EndEnumeration

Procedure.l OpenRsPort()
  
  SerialPortName$ = "COM1"
  Baud = 9600
  Parity = #PB_SerialPort_NoParity
  DataLength = 8
  Stop.f = 2
  HandshakeMode = #PB_SerialPort_NoHandshake
  InputBufferSize = 1024
  OutputBufferSize = 1024
  
  ProcedureReturn OpenSerialPort(#SerialPort, SerialPortName$, Baud, Parity, DataLength, Stop.f, HandshakeMode, InputBufferSize, OutputBufferSize)
  
EndProcedure

Procedure IsRsPort()
  
  If IsSerialPort(#SerialPort)
    ProcedureReturn 1
  Else
    ProcedureReturn OpenRsPort()
  EndIf
    
EndProcedure

Procedure.s ReadRsString()
  
  If IsRsPort()
  
    While Wait < 1000
      
      Buffer = AvailableSerialPortInput(#SerialPort)
      
      If Buffer > 0
        
        While Buffer > 0
          ReadSerialPortData(#SerialPort,@RD,1)
          Received$ + Chr(RD)
          
          Buffer = AvailableSerialPortInput(#SerialPort)
          
          If Buffer < 2
            Delay(5)
            Buffer = AvailableSerialPortInput(#SerialPort)
          EndIf
        Wend

        Break
        
      Else
        Wait+1
        Delay(1)
      EndIf
      
    Wend
  EndIf
  
  ProcedureReturn Received$
  
EndProcedure

Debug ReadRsString()
Dabei trigger ich die Geräte immer an, das dieses mir einen neuen Wert schicken sollen. So weiß ich immer welche Daten zurückkommen sollten.
PB: 5.xx LTS x86/x64 | WIN: 10 Pro x64, Linux Mint x64
Antworten