Aus einem String Textzeile isolieren

  • Hallo, ich habe einen GPS empfänger, der mir über RS232 (COM4) Daten schickt. Daraus muss ich eine Zeile isolieren. Hier mal mein Test Code, um Daten zu empfangen ;)

    [autoit]

    #include "Func_Serial.au3"
    #include <String.au3>
    ;$ourDll = DllOpen(@SystemDir & "\kernel32.dll")

    [/autoit][autoit][/autoit][autoit][/autoit][autoit]

    Global Const $ComPort = 4
    Global Const $Baudrate = 4800
    Global Const $Bits = 8
    Global Const $Parity = 0
    Global Const $Stop = 0
    Global Const $Rts = 0

    [/autoit][autoit][/autoit][autoit][/autoit][autoit]

    Local $SendPort = _OpenCOMPort($ComPort, $Baudrate, $Bits, $Parity, $Stop, $Rts)
    If $SendPort = -1 Then MsgBox(0, "Fehler", "Der sendende COM-Port konnte nicht geöffnet werden!")

    [/autoit][autoit][/autoit][autoit][/autoit][autoit][/autoit][autoit]

    While 1
    $sende1=_ReceiveStringWait($SendPort,1000,1000)
    ConsoleWrite("Sende1 "&$sende1&@CRLF)
    WEnd
    _CloseCOMPort($SendPort)

    [/autoit]

    Ok, und als Ergebniss, bekomme ich z.B. etwas wie:

    Spoiler anzeigen

    Sende1
    $GPRMC,022022,V,3900.0000,N,09500.0000,W,000.0,000.0,010105,003.8,E*7B
    $GPGGA,022022,3900.0000,N,09500.0000,W,0,00,,,M,,M,,*49
    $GPGSA,A,1,,,,,,,,,,,,,,,*1E
    $GPGSV,3,1,12,01,00,000,,02,00,000,,03,00,000,,04,00,000,*7C
    $GPGSV,3,2,12,24,00,000,,25,00,000,,27,00,000,,28,00,000,*75
    $GPGSV,3,3,12,29,00,000,,30,00,000,,31,00,000,,32,00,000,*71

    Daraus würde ich gerne in einen extra String die Zeile "$GPRMC,022022,V,3900.0000,N,09500.0000,W,000.0,000.0,010105,003.8,E*7B" isolieren. Am besten wären die Anhaltspunkte, ab $GPRMC, abzuschneiden und bis das nächste $-Zeichen von $GPGGA kommt. Die Daten "$GPRMC,022022,V,3900.0000,N,09500.0000,W,000.0,000.0,010105,003.8,E*7B" können varieren, deshalt die beiden äuseren Punkte.
    Wie kann man aus dem String die Zeile am besten hinaus schreiben?

    Lg Tim

  • Probiere es mal damit:

    [autoit]


    #include "Func_Serial.au3"
    #include <String.au3>
    ;$ourDll = DllOpen(@SystemDir & "\kernel32.dll")

    [/autoit][autoit][/autoit][autoit][/autoit][autoit]

    Global Const $ComPort = 4
    Global Const $Baudrate = 4800
    Global Const $Bits = 8
    Global Const $Parity = 0
    Global Const $Stop = 0
    Global Const $Rts = 0

    [/autoit][autoit][/autoit][autoit][/autoit][autoit]

    Local $SendPort = _OpenCOMPort($ComPort, $Baudrate, $Bits, $Parity, $Stop, $Rts)
    If $SendPort = -1 Then MsgBox(0, "Fehler", "Der sendende COM-Port konnte nicht geöffnet werden!")

    [/autoit][autoit][/autoit][autoit][/autoit][autoit][/autoit][autoit]

    While 1
    $sende1=_ReceiveStringWait($SendPort,1000,1000)
    $aFilter = StringRegExp($sende1, "\$GPRMC,(.*),E\*7B", 3)
    If Not @error Then ConsoleWrite("Sende1 "&$aFilter[0]&@CRLF)
    WEnd
    _CloseCOMPort($SendPort)

    [/autoit]

    Gruß,
    UEZ

    Auch am Arsch geht ein Weg vorbei...

    ¯\_(ツ)_/¯

  • Hey, danke euch beiden. Mit dem Code von UEZ, geht es super ;)

    Ich bekomme als Antwort " Sende1 031442,V,3900.0000,N,09500.0000,W,000.0,000.0,010105,003.8 "
    Am Ende wird ",E*7B" leider angeschnitten. Das hätte ich gerne noch drann ;)
    Ich habe auf http://translation.autoit.de/onlinehilfe/fu…tringRegExp.htm nachgelesen, und komme leider nicht mit dem Flag zurecht. UEZ schreibt eine "3". Bei der Erklärung, gibt es aber nur 0,1 oder 2. Was bedeutet die drei ?

    DANKE
    Lg Tim