PureBoard
https://www.purebasic.fr/german/

Stringausgabe mit Serialer Schnittstellt / Serial Port / Com
https://www.purebasic.fr/german/viewtopic.php?f=17&t=30568
Seite 1 von 1

Autor:  kaitec [ 26.01.2018 13:54 ]
Betreff des Beitrags:  Stringausgabe mit Serialer Schnittstellt / Serial Port / Com

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:
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

Autor:  Bisonte [ 26.01.2018 14:09 ]
Betreff des Beitrags:  Re: Stringausgabe mit Serialer Schnittstellt / Serial Port /

Probiere einfach mal aus, die Zeile

Code:
result.s = PeekS(*SPuffer, length)


durch

Code:
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.

Autor:  NicTheQuick [ 26.01.2018 14:28 ]
Betreff des Beitrags:  Re: Stringausgabe mit Serialer Schnittstellt / Serial Port /

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.

Autor:  kaitec [ 26.01.2018 15:07 ]
Betreff des Beitrags:  Re: Stringausgabe mit Serialer Schnittstellt / Serial Port /

Bisonte hat geschrieben:
Probiere einfach mal aus, die Zeile

Code:
result.s = PeekS(*SPuffer, length)


durch

Code:
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:
Zitat:









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

Autor:  mk-soft [ 26.01.2018 16:25 ]
Betreff des Beitrags:  Re: Stringausgabe mit Serialer Schnittstellt / Serial Port /

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.

Autor:  kaitec [ 26.01.2018 17:10 ]
Betreff des Beitrags:  Re: Stringausgabe mit Serialer Schnittstellt / Serial Port /

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.

Autor:  NicTheQuick [ 26.01.2018 17:22 ]
Betreff des Beitrags:  Re: Stringausgabe mit Serialer Schnittstellt / Serial Port /

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.

Autor:  mk-soft [ 26.01.2018 19:57 ]
Betreff des Beitrags:  Re: Stringausgabe mit Serialer Schnittstellt / Serial Port /

Habe das mal alles versucht über ein Thread zu lösen.
Mit ein Soft-Simulator funktioniert es...

Link: viewtopic.php?f=8&t=30569

Seite 1 von 1 Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/