Serielle Schnittstelle

Anfängerfragen zum Programmieren mit PureBasic.
christophe
Beiträge: 14
Registriert: 25.08.2011 11:14

Serielle Schnittstelle

Beitrag von christophe »

Guten Tage alle zusammen.

Bin nun schon zwei Tage am basteln und komme nicht zum Ziel.

Ich will über die Serielle Schnittstelle einen String einlesen. Der Sender, ein Microcontroller, sendet ca. alle 16ms einen String mit ca. 10 Zeichen.

Ich schaffe es einfach nicht diesen String zu lesen. Zwar erhalte ich Zeichen, nur entsprechen die einfach nicht dem was gesendet wurde.

Die Parameter der Schnittstelle sind richtig gesetzt und mit einem andern Monitorprogramm funktioniert es.

Was mache ich falsch?

Vielen Dank

Christophe

Code:

Code: Alles auswählen

OpenWindow(#PB_Any,5,5,500,500, "Test", #PB_Window_SystemMenu |#PB_Window_ScreenCentered)
;Frame3DGadget(#PB_Any, 20, Top, 450, 200, "Instrument Info:") : Top+20

EditorGadget(10,20,20,460, 460, #PB_String_ReadOnly)

Port$ = "/dev/cu.usbserial-FTSEOH01"

If OpenSerialPort(1, Port$, 115200, #PB_SerialPort_NoParity, 8, 1, #PB_SerialPort_NoHandshake, 40, 40)
;   Debug "Success"
Else
  SetGadgetText(10,"Comport konnte nicht geöffnet werden" + Chr(13) + Chr(10))
EndIf
Repeat
   EventID = WindowEvent()
      
    While AvailableSerialPortInput(1) > 0 
    
      If ReadSerialPortData(1,@Byte,1) = 1
         text.s=text.s+Chr(Byte)
       EndIf
     Wend

     Text.s = Text.s + Chr(13) + GetGadgetText(10)
     SetGadgetText(10, text.s)
     Text.s = ""
  
Until EventID = #PB_Event_CloseWindow
__________________________________________________
Code-Tags hinzugefügt
25.08.2011
RSBasic
christophe
Beiträge: 14
Registriert: 25.08.2011 11:14

Re: Serielle Schnittstelle

Beitrag von christophe »

Danke für das Anfügen des Code-Tags. Werde das wohl auch noch kapieren.

Christophe
heinz
Beiträge: 6
Registriert: 20.10.2009 11:41

Re: Serielle Schnittstelle

Beitrag von heinz »

Vermutlich gehen Daten verloren weil die Repeat-Until Schleife nicht oft genug läuft und der Puffer mit 40 Byte schnell voll ist.
Man könnte einen Timer verwenden um die Schleife anzustossen (AddWindowTimer).
christophe
Beiträge: 14
Registriert: 25.08.2011 11:14

Re: Serielle Schnittstelle

Beitrag von christophe »

Danke Heinz,

Ich habe es nun so gelöst, dass ich warte bis eine bestimmte Anzahl an Zeichen vorhanden sind und lese erst dann.

Das funktioniert so auch, bloss die Zeichen entsprechen nicht dem was gesendet wurde.

Anstelle von Zahlen erhalte ich Buchstaben.

Christophe

Code: Alles auswählen

OpenWindow(#PB_Any,5,5,500,500, "Test", #PB_Window_SystemMenu |#PB_Window_ScreenCentered)
;Frame3DGadget(#PB_Any, 20, Top, 450, 200, "Instrument Info:") : Top+20

EditorGadget(10,20,20,460, 460, #PB_String_ReadOnly)

Port$ = "/dev/cu.usbserial-FTSEOH01"
*Byte = AllocateMemory(1024)
If OpenSerialPort(1, Port$, 115200, #PB_SerialPort_NoParity, 8, 1, #PB_SerialPort_NoHandshake, 1024, 1024)
;   Debug "Success"
Else
  SetGadgetText(10,"Comport konnte nicht geöffnet werden")
  Delay (3000)
  End
EndIf
Durchgang.b = 0
Repeat
  
  EventID = WindowEvent()
  
    If AvailableSerialPortInput(1) > 30

      Result1.l = AvailableSerialPortInput(1)

        Result.l = ReadSerialPortData(1,*Byte,40)
        Text.s = PeekS(*Byte)
        
        Result1.l = AvailableSerialPortInput(1)   
    
        String.s=text.s + " Anz. Zeichen: " + Str(Result1) + GetGadgetText(10)

        SetGadgetText(10, String.s + " ")
        
    EndIf
  
Until EventID = #PB_Event_CloseWindow

christophe
Beiträge: 14
Registriert: 25.08.2011 11:14

Re: Serielle Schnittstelle

Beitrag von christophe »

Das Problem ist fast gelöst:

Das ganze Funktioniert unter Windows, aber nicht auf MAC. Ich habe den Eindruck, dass das mit dem Zeichensatz zutun hat.

Weiss jemand etwas darüber?

Christophe
Benutzeravatar
HeX0R
Beiträge: 3040
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win11 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2 + 3
Kontaktdaten:

Re: Serielle Schnittstelle

Beitrag von HeX0R »

Bist du denn sicher, dass die Zeichen überhaupt als Ascii gesendet werden?

Probier es mal so:

Code: Alles auswählen

Procedure main()
	Protected Port$, *Byte, Text1.s, Text2.s, Bytes

	OpenWindow(#PB_Any, 5, 5, 500, 500, "Test", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
	EditorGadget(0, 20, 20, 460, 460, #PB_String_ReadOnly)

	Port$ = "/dev/cu.usbserial-FTSEOH01"
	*Byte = AllocateMemory(1024)

	If OpenSerialPort(0, Port$, 115200, #PB_SerialPort_NoParity, 8, 1, #PB_SerialPort_NoHandshake, 1024, 1024) = 0
		AddGadgetItem(0, -1, "Kann COM-Port nicht öffnen!")
	EndIf

	Repeat

		Select WaitWindowEvent(5)
			Case #PB_Event_CloseWindow
				Break
			Case 0
				If IsSerialPort(0)
					Bytes = AvailableSerialPortInput(0)
					If Bytes > 30
						Result = ReadSerialPortData(0, *Byte, Bytes)
						Text1  = PeekS(*Byte, Result)
						Text2  = ""
						For i = 0 To Result - 1
							Text2 + Str(*Byte + i) + ";"
						Next i
						AddGadgetItem(0, -1, "Text1:" + Text1)
						AddGadgetItem(0, -1, "Text2:" + Left(Text2, Len(Text2) - 1))
						AddGadgetItem(0, -1, "")
					EndIf
				EndIf
		EndSelect
	ForEver


	If IsSerialPort(0)
		CloseSerialPort(0)
	EndIf
	FreeMemory(*Byte)
EndProcedure

main()
Text2 zeigt hier die "Rohwerte", die empfangen werden.
christophe
Beiträge: 14
Registriert: 25.08.2011 11:14

Re: Serielle Schnittstelle

Beitrag von christophe »

Hallo XOR

Vielen Dank für Deine Antwort.

Ja, ich bin sicher, dass es ASCII ist. Allerdings ist das mit der Sicherheit so eine Sache (Offtopic Thema).
Deinen Vorschlag probiere ich morgen aus.

Wäre wirklich schön, wenn das Ganze auf beiden Platformen arbeiten würde.

Christophe
christophe
Beiträge: 14
Registriert: 25.08.2011 11:14

Re: Serielle Schnittstelle

Beitrag von christophe »

Guten morgen HeXor

Ich habe es ausprobiert.

Die Daten in Text1 sind so wie bei mir, die "Rohwerte" bestehen aus einer 7-Stelligen sich aufaddierenden Zahl, für jedes Lesen gleich.

Was bedeuten diese?

Christophe

Edit: Kann es sein, dass es sich dabei um die *Adresse handelt und nicht um den Inhalt?
Benutzeravatar
HeX0R
Beiträge: 3040
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win11 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2 + 3
Kontaktdaten:

Re: Serielle Schnittstelle

Beitrag von HeX0R »

christophe hat geschrieben: Edit: Kann es sein, dass es sich dabei um die *Adresse handelt und nicht um den Inhalt?
Mist, sowas passiert, wenn man blind programmiert :freak:
Die eine Zeile muss natürlich wie folgt lauten:

Code: Alles auswählen

Text2 + Str(PeekB(*Byte + i)) + ";"
Entschuldige
christophe
Beiträge: 14
Registriert: 25.08.2011 11:14

Re: Serielle Schnittstelle

Beitrag von christophe »

Nicht so schlimm, hätte da selber drauf kommen können.

Die Rohwerte entsprechen den ASCii werten. Immerhin stimmt die Anzahl unterschiedlicher Zeichen.

Bin etwas ratlos.

Christophe
Antworten