ReadSerialPortData verhält sich komisch

Anfängerfragen zum Programmieren mit PureBasic.
rupert
Beiträge: 7
Registriert: 08.04.2013 18:14

ReadSerialPortData verhält sich komisch

Beitrag von rupert »

Hallo,
ich habe ein seltsames Verhalten mit der Empfangsroutine.
In dieser Routine sende ich ein "?"+#CR zu einem uC. Der uC sendet jedes byte
wieder zurück und hängt nach dem CR noch ein LF dran. Nach ca. 1ms schikt dann der uC noch
ein string mit "SL1"+#CRLF hinterher.
Die Empfangsroutine liefert aber nur das "?"+#CR zurück; das "SL1..." fehlt.

Wenn ich beim Echo nur das "?" zurücksende (ohne das #CRLF dann liefert die Empfangsroutine das
"SL1"#CR. Beide messages bekomme ich nicht !!

Was ist zu tun um beide Meldungen zurück zubekommen also "?"+#CRLF+"SL1"+#CRLF...

Code: Alles auswählen

Procedure connect(buffer$)
  WriteSerialPortString(0, buffer$,#PB_Ascii)
  Delay(10)
  If AvailableSerialPortInput(0) > 0
     Puffer$ = Space(AvailableSerialPortInput(0))
     ReadSerialPortData(0, @Puffer$, AvailableSerialPortInput(0))
    If FindString(Puffer$,"SL1",0,#PB_String_NoCase)
       ProcedureReturn #True
     Else
       MessageRequester("Fail","No Target found: ") 
       ProcedureReturn #False
     EndIf
   Else
      MessageRequester("Fail","serial port error ") 
      ProcedureReturn #False   
   EndIf
 EndProcedure 
__________________________________________________
Code-Tags hinzugefügt
08.04.2013
RSBasic
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: ReadSerialPortData verhält sich komisch

Beitrag von NicTheQuick »

Ich würde es mal mit einem Timout versehen und dann so versuchen:

Code: Alles auswählen

EnableExplicit

#SERIAL_TIMEOUT = 100	;in ms

Procedure connect(buffer$)
	Protected availableData.i, ascii.a, buffer.s = "", time.i
	
	WriteSerialPortString(0, buffer$, #PB_Ascii)
	time = ElapsedMilliseconds()
	While ElapsedMilliseconds() < time + #SERIAL_TIMEOUT
		availableData = AvailableSerialPortInput(0)
		If availableData > 0 ;Es sind Daten da, lies sie aus
			While availableData > 0 ;Lies solange ASCII-Zeichen aus bis der Puffer leer ist
				availableData - ReadSerialPortData(0, @ascii, 1)
				buffer + Chr(ascii)
			Wend
			
			If FindString(buffer, "SL1", 0, #PB_String_NoCase)
				ProcedureReturn #True
			EndIf
			time = ElapsedMilliseconds()
		EndIf
	Wend
	
	MessageRequester("Fail", "Timout: Serial port error.") 
	ProcedureReturn #False
EndProcedure
Dadurch, dass ich einzelne Ascii-Zeichen auslese, kann es auch keine Probleme mit Unicode geben, falls du das in den Compiler-Einstellungen aktiviert hast.
Erst wenn nach 100 ms nichts mehr kommt, bricht die Procedure mit #False ab. Wenn "SL1" gefunden wurde, bricht sie mit #True ab.
rupert
Beiträge: 7
Registriert: 08.04.2013 18:14

Re: ReadSerialPortData verhält sich komisch

Beitrag von rupert »

Vilen Dank für die Antwort.
Leider Fehlt immer noch das Echo im buffer$.
Ich schicke beim Echo (vom uC) jetzt nur das "?" (ohne #CRLF) zurück.
Wenn ich ein Terminal (Terra Term) hernehme sehe ich "?SL1\r\n"
Im buffer$ von Deinem Programmvorschlag steht aber nur SL1. Auch wenn ich
den Timeout auf 400ms hochsetzte... ? Was könnte das noch sein ?
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: ReadSerialPortData verhält sich komisch

Beitrag von NicTheQuick »

Was bekommst du, wenn du zwischen

Code: Alles auswählen

availableData - ReadSerialPortData(0, @ascii, 1)
und

Code: Alles auswählen

buffer + Chr(ascii)
noch ein

Code: Alles auswählen

Debug "Wert: " + ascii + " Zeichen:'" + Chr(ascii) + "'"
setzt und dir die eingelesenen Zeichen anschaust? Ist dann alles dabei? Sind vielleicht auch Null-Bytes zu setzen?
rupert
Beiträge: 7
Registriert: 08.04.2013 18:14

Re: ReadSerialPortData verhält sich komisch

Beitrag von rupert »

ich habe durchgesteppt und mit die variablen liste dabei offen.
Das erste Zeichen das reinkommt ist das S.
Mit Debug "Wert: " + ascii + " Zeichen:'" + Chr(ascii) + "' wie angegeben sehe ich das selbe...
Das erste Zeichen ist das S.
Wie wenn das erste Zeichen das "?" überschrieben wird... Ich hänge über virtual com an einem PIC24Fj64...
Das Terra Term zeigt mir das alles richtig an...?
rupert
Beiträge: 7
Registriert: 08.04.2013 18:14

Re: ReadSerialPortData verhält sich komisch

Beitrag von rupert »

wie würde es aussehen wenn ich keinen String sondern binäre Zeichen (0x3F,0x0D) sende...
In C wüsste ich wie es geht aber ich tue mich noch schwer mit den datentypen in Pure Basic...
DIM Buf.b (3)
Buf(0) = 63 (für hex 0x3f geht nicht ????ß)
Buf(1) = 13 (CR)
... und dann die Übergabe des Buf ?
das ist ein ewiges rumprobieren...
Benutzeravatar
Danilo
-= Anfänger =-
Beiträge: 2284
Registriert: 29.08.2004 03:07

Re: ReadSerialPortData verhält sich komisch

Beitrag von Danilo »

rupert hat geschrieben:ich tue mich noch schwer mit den datentypen in Pure Basic...
PB-Hilfe: "Variablen und Datentypen"

Hex-Zahlen gehen mit '$'.

Code: Alles auswählen

Dim Buf.a(3)
Buf(0) = $3F ;(für hex 0x3f)
Buf(1) = $0D ;(CR)

; Adresse des Array ist @Buf() oder einfach nur Buf()
Debug Buf()
Debug @Buf()

Debug @Buf(0) ; Adresse von Element 0
Debug @Buf(1) ; Adresse von Element 1
Debug @Buf(2) ; Adresse von Element 2

Debug Buf(0) ; Inhalt von Element 0
Debug Buf(1) ; Inhalt von Element 1
Debug Buf(2) ; Inhalt von Element 2
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
Benutzeravatar
Falko
Admin
Beiträge: 3535
Registriert: 29.08.2004 11:27
Computerausstattung: PC: MSI-Z590-GC; 32GB-DDR4, ICore9; 2TB M2 + 2x3TB-SATA2 HDD; Intel ICore9 @ 3600MHZ (Win11 Pro. 64-Bit),
Acer Aspire E15 (Win11 Home X64). Purebasic LTS 6.11b1
HP255G8 Notebook @AMD Ryzen 5 5500U with Radeon Graphics 2.10 GHz 3.4GHz, 32GB_RAM, 3TB_SSD (Win11 Pro 64-Bit)
Kontaktdaten:

Re: ReadSerialPortData verhält sich komisch

Beitrag von Falko »

http://www.purebasic.fr/german/viewtopi ... 61#p289061
Speziell zur Hex-wert-übergabe als Daten an den seriellen Port habe ich den Code hier mal
heraus extrahiert.

Code: Alles auswählen

*Puffer = AllocateMemory(1024)

PokeA(*Puffer + 0, $1B)
PokeA(*Puffer + 1, $03)

WriteSerialPortData(1, *Puffer, 2)
Gruß,
Falko
Bild
Win11 Pro 64-Bit, PB_6.11b1
rupert
Beiträge: 7
Registriert: 08.04.2013 18:14

Re: ReadSerialPortData verhält sich komisch

Beitrag von rupert »

@Falko, Vielen Dank.
ich habe in der Doku keine vernünftige Art gefunden ein binäres array kompakt vor zu besetzten.
gibt es ein Äquivalent in Pure Basic zu in C
MyArray[] = {0x44,0x33.......
0x21,0xF0.......};
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: ReadSerialPortData verhält sich komisch

Beitrag von NicTheQuick »

Leider gibt es in PureBasic sowas einfaches nicht. Aber man kann sich schnell mit einer Datasection behelfen, wenn es um reine statische Arrays geht, die nachträglich nicht mehr verändert werden.

Code: Alles auswählen

Structure StaticArray
	a.a[0]
	b.b[0]
	w.w[0]
	l.l[0]
EndStructure


DataSection
	myArray:
		Data.a $44, $33, $21, $F0
EndDataSection
Define *array.StaticArray

*array = ?myArray

Debug "Als Ascii"
Debug *array\a[0]
Debug *array\a[1]
Debug *array\a[2]
Debug *array\a[3]

Debug "Als Byte"
Debug *array\b[0]
Debug *array\b[1]
Debug *array\b[2]
Debug *array\b[3]

Debug "Als Word"
Debug *array\w[0]
Debug *array\w[1]

Debug "Als Long"
Debug *array\l[0]
Antworten