_WinAPI_CreateFile / DllStructCreate: Wie groß muss der Puffer sein?

  • Hallo zusammen :)

    Ich sitze seit Tagen an einem Problem.
    Ich Habe einen Barcodeleser, dessen Ausgabe ich über den virtuellen Bluetooth-COM Port im SPP Modus auslesen möchte.
    Leider kann CommMG.au3 / CommAPI.au3 nicht mit diesen virtuellen Bluetooth COM-Ports umgehen, mit einem USB -> COM Adpater jedoch schon.

    Ich habe herausgefunden, dass man COM-Ports auch mittels "_WinAPI_CreateFile("COM5", 2, 2)" ansprechen kann.
    Soweit so gut, das klappt auch zuverlässig mit den BT-COM Ports.

    Aber: Wenn ich den Output des Barcodelesers auslesen will, dann muss ich ja diesen Befehl anwenden:

    Nun kommt das kuriose:

    Wenn ich "$tBuffer = DllStructCreate("byte[10]")" z.B. auf "$tBuffer = DllStructCreate("byte[20]")" setze und "_WinAPI_ReadFile($Input, DllStructGetPtr($tBuffer), 10, $nBytes)" auf "_WinAPI_ReadFile($Input, DllStructGetPtr($tBuffer), 20, $nBytes)" , dann muss ich 2x scannen, damit _WinAPI_ReadFile den Barcode verarbeitet und ausgibt. Dann habe ich aber auch meist beide eingescannte Codes in einer Ausgabe.


    Muss ich diese "Puffergröße" immer nahe an den 100% "füllen", damit _Win_API_ReadFile greift?
    Gibt es eine zuverlässigere Methode meinen BT-Com Port auszulesen?
    Wenn ich einen Barcodeleser über USB -> COM anschließe und mit CommAPI.au3 / CommMG.au3 arbeite ist alles perfekt, aber da funktionieren (obwohl Ports aufgelistet werden) die BT-COM Ports nicht.

    Erfahrung ist eine nützliche Sache. Leider macht man sie immer erst kurz nachdem man sie brauchte :P

    Einmal editiert, zuletzt von Crusoe (13. Mai 2017 um 02:24)

  • Hallo zusammen :)

    Vielen Dank für die rege Anteilnahme an meinem Problem :thumbdown:

    Da ich es aber auch nicht leiden kann, wenn jemand irgendwann schreibt: "Danke, geht." und auf Nachfrage nicht mitteilt wie es nun bewerkstelligt wurde, hier meine Lösung zu o.g. Problem.

    Erfahrung ist eine nützliche Sache. Leider macht man sie immer erst kurz nachdem man sie brauchte :P

  • Vielen Dank für die rege Anteilnahme an meinem Problem

    Soll ab und an mal vorkommen, dass niemand online ist, der eine sinnvolle Anwort auf derart spezielle Fragen hat... :D

    Hier noch eine kleine Optimierung:

    Einmal editiert, zuletzt von Bitnugger (13. Mai 2017 um 13:07)

  • Hi Bitnugger,

    ja... Es ist eine bodenlose Frechheit, dass man hier niemanden zwischen 0:00 Uhr und 05:00 Uhr antrifft...
    :ironie: (Damit das auch richtig verstanden wird :D )

    Vielen Dank für den Tipp :)
    Ich kann deine Verbesserung zwar gerade im Kopf nicht nachvollziehen (soll jedoch nichts heißen), werde das aber später zu Hause ausprobieren und berichten :thumbup:

    Erfahrung ist eine nützliche Sache. Leider macht man sie immer erst kurz nachdem man sie brauchte :P

  • Hi Bitnugger,

    ich habe deine Änderung mal umgesetzt.

    Leider funktioniert das nicht so ganz.
    Nach deiner Schleife wird "$instr" verwendet und danach geleert ($instr = "").

    Soweit so gut.
    Dann kommt deine Schleife erneut zum Einsatz und dann rennt sie mit einem leeren String durch.
    Die Do Until Schleife scheint beim zweiten Mal nicht auf "_WinAPI_ReadFile($Input, DllStructGetPtr($tBuffer), 1, $nBytes)" zu warten, bis etwas eingescannt wird.

    Erfahrung ist eine nützliche Sache. Leider macht man sie immer erst kurz nachdem man sie brauchte :P

  • Dann lasse dir mal in der Do-Until Schleife Inhalt und Länge von $tBuffer und $nBytes anzeigen... denn wie es scheint kommen beim zweiten Durchlauf keine Daten mehr an...

    • weil $nBytes = "" oder <= 2 ist
    • weil $tBuffer leer ist / _WinAPI_ReadFile keine Daten einlesen konnte

    2 Mal editiert, zuletzt von Bitnugger (14. Mai 2017 um 03:35)

  • Das stimmt, beim zweiten Durchlauf kommen keine Daten mehr an.
    Wenn ich deine Funktion richtig verstanden habe, dann soll sie ja "Do" ausführen bis $sRead nichts mehr beinhaltet.
    Da du innerhalb der Do...Until Schleife schon meinen "Endmarker" (@CR) rausfilterst, geht die Schleife beim zweiten Mal natürlich direkt durch.
    $sRead ist ja leer. Normalerweise wartet die Do...Until Schleife an der _WinAPI_ReadFile Funktion.
    Ich habe allerdings noch nicht verstanden, warum sie das beim zweiten Mal nicht tut.

    EDIT:
    Ich habe versucht $sRead vorher (außerhalb Do...Until) einen Wert zu geben ($sRead = "Test") bevor es in die zweite Runde der Do..Until Schleife geht. Jedoch ohne Erfolg.
    Geht einfach durch

    Erfahrung ist eine nützliche Sache. Leider macht man sie immer erst kurz nachdem man sie brauchte :P

    Einmal editiert, zuletzt von Crusoe (14. Mai 2017 um 12:23)

  • a) Ist bei jedem Durchlauf immer nur ein Barcode in dem File ($Input) enthalten, oder mehrere? Wenn mehrere, willst du dann jeweils nur einen pro Durchlauf auslesen, oder sollen alle in einem Array übergeben werden?

    b) Wie lang ist der längstmögliche Barcode (inkl. der zwei möglichen Bytes für die Endekennung CR und / oder LF)

  • Hallo Bitnugger,

    ich arbeite an einem KEVin-Modus (KEVIn = Kontrolliert Eingehenden Versehentlichen Input-Modus) für mein Programm.
    Von daher habe ich die Scanroutine ein wenig überarbeitet.

    Ich muss nach wie vor zwei Barcodes einscannen.
    Die Funktion wird bei erfolgreichem Durchlaufen erneut ausgeführt.
    Das sieht im Programm dann so aus:


    AutoIt
    ### [...] ###
    
    
    _ScanBarcode
    _ScanBarcode
    
    
    ### [...] ###

    Zweck dieser Funktion:
    Den eingescannten Barcode auswerten und der richtigen Variable zuordnen.

    Möglichkeit 1 (Zeile 18): Wenn der Barcode nur aus Zahlen besteht (StringIsDigit) und 6 Stellen (StringLen($InStr) = 6) hat, dann ist es die Inventarnummer ($Inventarnummer)

    Möglichkeit 2 (Zeile 20): Wenn der Barcode aus Zahlen und / oder Buchstaben besteht (StringIsAlNum) und mit einem S anfängt (StringLeft($InStr), 1), dann ist es die Seriennummer.

    Möglichkeit 3 (Zeile 24):
    Möglichkeit 1 & 2 traten nicht auf. Hier kommt die Kernfunktion des KEVin-Modus zum tragen. Es erscheint ein Hinweis und die Funktion wird neugestartet, solange bis beide Barcodes stimmen.
    Die vielen Leerzeichen in der MsgBox-Funktion sind notwendig, sonst steht die zweite Zeile nicht mittig unter der ersten Zeile.


    P.S. Den Barcodegenerator (MakeBarcode()) habe ich von andybiochem aus dem autoitscript-Forum abgekupfert und an meine Bedürfnisse angepasst.
    Andy, du bist der Geilste :thumbup:

    P.P.S. Namen und damit verknüpfte Klischees sind rein zufälliger Natur :whistling:

    Erfahrung ist eine nützliche Sache. Leider macht man sie immer erst kurz nachdem man sie brauchte :P

    3 Mal editiert, zuletzt von Crusoe (14. Mai 2017 um 17:07)

  • Ja, die Info hättest du schon viel eher bringen sollen. ;)

    Ich setze mich noch mal dran und tippere dir was... aber vorab noch ein Tip.

    AutoIt
    $InStr = String($InStr & BinaryToString(DllStructGetData($tBuffer, 1)))

    BinaryToString wandelt die Binärdaten doch bereits in einen String um... wieso also nochmals einen String in einen String konvertieren wollen?


    AutoIt
    $InStr &= BinaryToString(DllStructGetData($tBuffer, 1))

    So ist das viel eleganter...

    Meine zweite Frage hast du aber nicht beantwortet!

  • AutoIt
    $InStr = String($InStr & BinaryToString(DllStructGetData($tBuffer, 1)))

    BinaryToString wandelt die Binärdaten doch bereits in einen String um... wieso also nochmals einen String in einen String konvertieren wollen?


    Weil ich doof bin und mir es beim Umstellen früherer Funktionen nicht auffiel, dass es noch da ist :huh:

    Meine zweite Frage hast du aber nicht beantwortet!


    Das habe ich in "Möglichkeit 1" und "Möglichkeit 2" erläutert.
    Oder ich habe dich falsch verstanden.

    Dann probiere ich es nochmal:
    Ein Barcode besteht nur aus Zahlen und besteht immer aus sechs Ziffern zzgl. der @CR Stelle am Ende.
    Der andere Barcode besteht aus Zahlen und / oder Buchstaben und beginnt immer mit einem "S". Dieser Barcode ist bisher immer 8 Zeichen lang, zzgl. der @CR Stelle am Ende).

    Erfahrung ist eine nützliche Sache. Leider macht man sie immer erst kurz nachdem man sie brauchte :P

  • was ist $nBytes? Wo kommt die Variable her? die wird nirgendwo deklariert. Ich dreh noch durch ich krieg den mist nich zum Laufen ich will doch einfach nur vom com port lesen damals ging das doch auch alles noch so leicht

  • Siehe Post #9:

    Code
    Func _ScanBarcode()
    Dim $nBytes
    ...

    Wobei $nBytes so nie definiert/initialisiert wird und somit jeden Wert haben könnte.

    funktioniert trotzdem nicht. warum kann man nich nen funktionierenden code posten statt so durcheinander gewürfelte schnipsel? Es gibt scheinbar KEIN Möglichkeit mehr nen stinknormalen com port mit AutoIt zu lesen. :clap:

  • Funktioniert trotzdem nicht. warum kann man nicht einen funktionierenden Code posten statt so durcheinander gewürfelte Schnipsel? Es gibt scheinbar KEINE Möglichkeit mehr einen stinknormalen Com-Port mit AutoIt zu lesen. :clap:

    Sich als Neumitglied gleich derart auszukotzen wird deine Chancen auf Hilfe auch nicht gerade erhöhen.

    Mit etwas Geduld werden schon noch Antworten kommen.

    Ansonsten poste dein Problem im Bereich "Mit / Ohne Gegenleistung".

    86598-musashi-c64-png

    "Am Anfang wurde das Universum erschaffen. Das machte viele Leute sehr wütend und wurde allenthalben als Schritt in die falsche Richtung angesehen."

  • Sich als Neumitglied gleich derart auszukotzen wird deine Chancen auf Hilfe auch nicht gerade erhöhen.

    Mit etwas Geduld werden schon noch Antworten kommen.

    Ansonsten poste dein Problem im Bereich "Mit / Ohne Gegenleistung".

    Eine unnötige Antwort wie deine gerade zu posten erhöht meine Chancen noch weniger, da sie leider vom System als Antwort gewertet wird. Und dann wird sich beschwert wenn ich die Frage erneut poste. Merkste was?

  • Eine unnötige Antwort wie deine gerade zu posten erhöht meine Chancen noch weniger, da sie leider vom System als Antwort gewertet wird. Und dann wird sich beschwert wenn ich die Frage erneut poste. Merkste was?

    Ja, ich merke, dass bei Dir, was Fragen der Höflichkeit angeht, noch Luft nach oben ist.

    Du kannst ja mal einen Blick auf einen Thread im EN-Forum werfen : serial-port-udf-com-port-udf

    86598-musashi-c64-png

    "Am Anfang wurde das Universum erschaffen. Das machte viele Leute sehr wütend und wurde allenthalben als Schritt in die falsche Richtung angesehen."