Seite 1 von 1

Stringausgabe mit Serialer Schnittstellt / Serial Port / Com

Verfasst: 26.01.2018 13:54
von kaitec
Hallo Gemeinde,

seit einigen Stunden versuche ich einen String vom Mikrocontroller zu emfangen. Leider vergebends bei der Auswertung. Schicke ich meinem Kontroller ein Befehl antwortet er darauf. Die Zeichen werden auch emfangen, aber nicht geordnet in einem String. Ich habe jetzt schon über das Forum einige Codes ausprobiert und umgeschrieben. Allerdings klappt es noch immer nicht.
Ich möchte am nach dem Auslesen des SerialPorts einen fertigen String haben, den ich mit einem Command-Befehl vergleichen kann und danach weitere Aktionen tätigen kann bzw. mein Programm später die Rückmeldung gibt, ob der gesendete Befehl an den Kontroller erfolgreich war.
Hier mein zu letzt getesteter Code:

Code: Alles auswählen

SPort$ = "Com33"
SBaud = 9600

*SPuffer = AllocateMemory(501)
#SerialPort = 1

Procedure.s RSString(port.i)
  length.i = AvailableSerialPortInput(port.i)
  If length > 0
   If Not ReadSerialPortData(port.i, *SPuffer, length)
    ;Debug "Error while reading input data"
    ProcedureReturn "ERROR" 
   Else
    result.s = PeekS(*SPuffer, length)
    buffer.s + result
    i = CountString(buffer, Chr(13)+Chr(10))
    If i > 0 ; check for newline
      For x.i = 1 To i
        line.s = StringField(buffer, x, Chr(13)+Chr(10))
        Debug line
        ProcedureReturn line
      Next
      buffer = StringField(buffer, x+1, Chr(13)+Chr(10)) ; add the new line to the buffer
     EndIf
    EndIf
  EndIf
  ProcedureReturn line
EndProcedure 
    
If OpenSerialPort(#SerialPort, SPort$, SBaud, #PB_SerialPort_NoParity, 8 ,1 ,#PB_SerialPort_NoHandshake, 500, 500)
  WriteSerialPortString(#SerialPort, "/help"+Chr(13)+Chr(10))

  y=0
  Repeat
    y=y+1
    Emf$ = RSString(#SerialPort)
    If Emf$ <> "ERROR"
      Debug Emf$
    EndIf
    ;Debug Buffer
    
        Delay(1)
  Until y > 300
  CloseSerialPort(#SerialPort)
  
EndIf
End
Leider zeigt der Debug nur leere Zeichen bei mir an. Ich bekomme keinen kompletten String mit ASCII 13+10 CR LF raus. Vielleicht kann mir jemand helfen.
L.G. Kai

Re: Stringausgabe mit Serialer Schnittstellt / Serial Port /

Verfasst: 26.01.2018 14:09
von Bisonte
Probiere einfach mal aus, die Zeile

Code: Alles auswählen

result.s = PeekS(*SPuffer, length)
durch

Code: Alles auswählen

result.s = PeekS(*SPuffer, length, #PB_ASCII)
zu ersetzen. Evt. ist dein Programm in Unicode kompiliert, und versucht demnach auch einen Unicode
String aus dem Puffer zu holen.

Re: Stringausgabe mit Serialer Schnittstellt / Serial Port /

Verfasst: 26.01.2018 14:28
von NicTheQuick
Genau das wird es sein. Im Übrigen ist WriteSerialPortString() auch nur bedingt richtig. Dort wird als Standard UTF-8 benutzt und das ist ohne Sonderzeichen identisch mit ASCII. Deswegen funktioniert es scheinbar. Zur Sicherheit solltest du aber auch hier als dritten Parameter #PB_Ascii verwenden.

Re: Stringausgabe mit Serialer Schnittstellt / Serial Port /

Verfasst: 26.01.2018 15:07
von kaitec
Bisonte hat geschrieben:Probiere einfach mal aus, die Zeile

Code: Alles auswählen

result.s = PeekS(*SPuffer, length)
durch

Code: Alles auswählen

result.s = PeekS(*SPuffer, length, #PB_ASCII)
zu ersetzen. Evt. ist dein Programm in Unicode kompiliert, und versucht demnach auch einen Unicode
String aus dem Puffer zu holen.
Ich habe es geändern. Der Debugger gibt folgendes aus:






NICHTS... =( Oh man. Noch ne Idee?

Re: Stringausgabe mit Serialer Schnittstellt / Serial Port /

Verfasst: 26.01.2018 16:25
von mk-soft
Das problem wird sein das der PC schneller ist als der Controller.

So mit muss man den Seriellen Port so lange lesen ist alle Zeichen angekommen sind.

Es gibt drei Methoden um zu erkennen das alle Zeichen angekommen sind.

- Der Controller sendet ein Ende-Zeichen. (#ETX, #CR, #LF, #CRLF, etc)
- Der Controller sendet eine feste länge von Daten.
- Zeichen-Verzugszeit. Es kommt in einer bestimmen Zeit kein neues Zeichen.

Re: Stringausgabe mit Serialer Schnittstellt / Serial Port /

Verfasst: 26.01.2018 17:10
von kaitec
Der Kontroller sendet breits #CRLF

mit dem oberen PB-Code habe ich bereits versucht, so lange zu lesen bis EOL kommt aber leider funktioniert dies nicht korrekt.

Re: Stringausgabe mit Serialer Schnittstellt / Serial Port /

Verfasst: 26.01.2018 17:22
von NicTheQuick
Du musst gegebenenfalls mehr als einmal ReadSerialPortData() aufrufen bis du alles gelesen hast, was da ist. Lass dir außerdem mal length ausgeben und schau, was das ausgibt.

Re: Stringausgabe mit Serialer Schnittstellt / Serial Port /

Verfasst: 26.01.2018 19:57
von mk-soft
Habe das mal alles versucht über ein Thread zu lösen.
Mit ein Soft-Simulator funktioniert es...

Link: http://www.purebasic.fr/german/viewtopi ... =8&t=30569