Seite 1 von 2
Serielle Schnittstelle
Verfasst: 25.08.2011 11:27
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
Re: Serielle Schnittstelle
Verfasst: 25.08.2011 16:45
von christophe
Danke für das Anfügen des Code-Tags. Werde das wohl auch noch kapieren.
Christophe
Re: Serielle Schnittstelle
Verfasst: 26.08.2011 07:26
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).
Re: Serielle Schnittstelle
Verfasst: 26.08.2011 10:51
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
Re: Serielle Schnittstelle
Verfasst: 26.08.2011 17:07
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
Re: Serielle Schnittstelle
Verfasst: 26.08.2011 17:37
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.
Re: Serielle Schnittstelle
Verfasst: 26.08.2011 18:44
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
Re: Serielle Schnittstelle
Verfasst: 27.08.2011 10:31
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?
Re: Serielle Schnittstelle
Verfasst: 27.08.2011 11:57
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
Die eine Zeile muss natürlich wie folgt lauten:
Entschuldige
Re: Serielle Schnittstelle
Verfasst: 27.08.2011 15:11
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