Seite 2 von 2

Re: Serielle Schnittstelle auslesen...

Verfasst: 04.09.2014 15:30
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.

Re: Serielle Schnittstelle auslesen...

Verfasst: 04.09.2014 22:22
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 

Re: Serielle Schnittstelle auslesen...

Verfasst: 07.09.2014 11:25
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.