Seite 1 von 2

ReadSerialPortData verhält sich komisch

Verfasst: 08.04.2013 18:35
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

Re: ReadSerialPortData verhält sich komisch

Verfasst: 08.04.2013 18:56
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.

Re: ReadSerialPortData verhält sich komisch

Verfasst: 08.04.2013 19:14
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 ?

Re: ReadSerialPortData verhält sich komisch

Verfasst: 08.04.2013 19:25
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?

Re: ReadSerialPortData verhält sich komisch

Verfasst: 08.04.2013 19:39
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...?

Re: ReadSerialPortData verhält sich komisch

Verfasst: 08.04.2013 20:00
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...

Re: ReadSerialPortData verhält sich komisch

Verfasst: 08.04.2013 20:16
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

Re: ReadSerialPortData verhält sich komisch

Verfasst: 08.04.2013 20:48
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

Re: ReadSerialPortData verhält sich komisch

Verfasst: 09.04.2013 07:35
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.......};

Re: ReadSerialPortData verhält sich komisch

Verfasst: 09.04.2013 09:38
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]