Stringausgabe mit Serialer Schnittstellt / Serial Port / Com

Hardware- und Elektronikbasteleien, Ansteuerung von Schnittstellen und Peripherie.
Fragen zu "Consumer"-Problemen kommen in Offtopic.
Benutzeravatar
kaitec
Beiträge: 120
Registriert: 07.11.2005 00:50
Wohnort: Langenselbold
Kontaktdaten:

Stringausgabe mit Serialer Schnittstellt / Serial Port / Com

Beitrag 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
Benutzeravatar
Bisonte
Beiträge: 2427
Registriert: 01.04.2007 20:18

Re: Stringausgabe mit Serialer Schnittstellt / Serial Port /

Beitrag 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.
PureBasic 6.04 LTS (Windows x86/x64) | Windows10 Pro x64 | Asus TUF X570 Gaming Plus | R9 5900X | 64GB RAM | GeForce RTX 3080 TI iChill X4 | HAF XF Evo | build by vannicom​​
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8675
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 32 GB DDR4-3200
Ubuntu 22.04.3 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken
Kontaktdaten:

Re: Stringausgabe mit Serialer Schnittstellt / Serial Port /

Beitrag 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.
Bild
Benutzeravatar
kaitec
Beiträge: 120
Registriert: 07.11.2005 00:50
Wohnort: Langenselbold
Kontaktdaten:

Re: Stringausgabe mit Serialer Schnittstellt / Serial Port /

Beitrag 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?
Benutzeravatar
mk-soft
Beiträge: 3695
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: Stringausgabe mit Serialer Schnittstellt / Serial Port /

Beitrag 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.
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Benutzeravatar
kaitec
Beiträge: 120
Registriert: 07.11.2005 00:50
Wohnort: Langenselbold
Kontaktdaten:

Re: Stringausgabe mit Serialer Schnittstellt / Serial Port /

Beitrag 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.
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8675
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 32 GB DDR4-3200
Ubuntu 22.04.3 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken
Kontaktdaten:

Re: Stringausgabe mit Serialer Schnittstellt / Serial Port /

Beitrag 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.
Bild
Benutzeravatar
mk-soft
Beiträge: 3695
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: Stringausgabe mit Serialer Schnittstellt / Serial Port /

Beitrag 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
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Antworten