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 :freak:
Die eine Zeile muss natürlich wie folgt lauten:

Code: Alles auswählen

Text2 + Str(PeekB(*Byte + i)) + ";"
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