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
und
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 Pure
Basic 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]