1. Dashboard
  2. Mitglieder
    1. Letzte Aktivitäten
    2. Benutzer online
    3. Team
    4. Mitgliedersuche
  3. Forenregeln
  4. Forum
    1. Unerledigte Themen
  • Anmelden
  • Registrieren
  • Suche
Alles
  • Alles
  • Artikel
  • Seiten
  • Forum
  • Erweiterte Suche
  1. AutoIt.de - Das deutschsprachige Forum.
  2. Mitglieder
  3. julezrules

Beiträge von julezrules

  • Verbindung zu ESP8266 Board (RFID Reader) nur nach reset möglich

    • julezrules
    • 26. November 2021 um 13:24
    Zitat von Oscar

    Ich hatte mal eine kleine UDF für die serielle Schnittstelle geschrieben: SerialComm.au3 (eine kleine UDF zum Datenaustausch mit dem Arduino)

    Das Beispiel ist zwar für AutoIt <-> Arduino, aber beim ESP8266 funktioniert das genauso.

    Danke schonmal für deine Antwort. Ich habe jetzt folgenden Script am Laufen der funktioniert:

    Code
    #include <WinAPI.au3>
    
    Dim $nBytes
    
    Global $COMPort = "COM4"
    Global $instr = ""
    Global $Input = _WinAPI_CreateFile($COMPort, 2, 2)
    Global $tBuffer = DllStructCreate("char[8]")
    
    While 1
        _WinAPI_ReadFile($Input, DllStructGetPtr($tBuffer), 1, $nBytes)
        $instr = String($instr & BinaryToString(DllStructGetData($tBuffer, 1)))
        If (StringLen($instr) = 8) Then
            ConsoleWrite($instr & @CRLF)
            $instr = ""
            $nBytes = ""
            sleep (500)
        EndIf
    WEnd
    Alles anzeigen


    Jetzt möchte ich aber 2 Arduinos verwenden bzw 2 COM Ports. Habe jetzt den Script so umgeschrieben aber leider funktioniert jetzt gar nichts mehr. Gar kein Output in der Konsole:

    Code
    #include <WinAPI.au3>
    
    Dim $nBytes_A
    Global $COMPort_A = "COM4"
    Global $instr_A = ""
    Global $Input_A = _WinAPI_CreateFile($COMPort_A, 2, 2)
    Global $tBuffer_A = DllStructCreate("char[8]")
    
    Dim $nBytes_B
    Global $COMPort_B = "COM6"
    Global $instr_B = ""
    Global $Input_B = _WinAPI_CreateFile($COMPort_B, 2, 2)
    Global $tBuffer_B = DllStructCreate("char[8]")
    
    
    While 1
        _WinAPI_ReadFile($Input_A, DllStructGetPtr($tBuffer_A), 1, $nBytes_A)
        $instr_A = String($instr_A & BinaryToString(DllStructGetData($tBuffer_A, 1)))
    
        _WinAPI_ReadFile($Input_B, DllStructGetPtr($tBuffer_B), 1, $nBytes_B)
        $instr_B = String($instr_B & BinaryToString(DllStructGetData($tBuffer_B, 1)))
    
        If (StringLen($instr_A) = 8) Then
            ConsoleWrite($instr_A & @CRLF)
            $instr_A = ""
            $nBytes_A = ""
            sleep (500)
        EndIf
    
        If (StringLen($instr_B) = 8) Then
            ConsoleWrite($instr_B & @CRLF)
            $instr_B = ""
            $nBytes_B = ""
            sleep (500)
        EndIf
    
    WEnd
    Alles anzeigen

    Hättest du da evtl ne Idee für mich woran das liegt bzw wie ich das zum Laufen bekomme?

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

    • julezrules
    • 26. November 2021 um 12:51
    Zitat von Musashi

    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?

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

    • julezrules
    • 26. November 2021 um 12:12
    Zitat von Moombas

    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:

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

    • julezrules
    • 26. November 2021 um 12:03

    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

  • Verbindung zu ESP8266 Board (RFID Reader) nur nach reset möglich

    • julezrules
    • 26. November 2021 um 11:52
    Zitat von Moombas

    Hmm, war nur eine Idee. Mit DLL kenne ich mich leider nicht aus und kann dir dazu nichts sagen.

    BTW: Oben spricht er COM4 an und in der MsgBox ist von COM3 die Rede. PAsst irgendwie nicht zusammen,

    Ja kleiner fehler beim übertragen ins forum hier. nich schlimm im original isses richtig.

  • Verbindung zu ESP8266 Board (RFID Reader) nur nach reset möglich

    • julezrules
    • 26. November 2021 um 10:59
    Zitat von Moombas

    Du änderst ja im 1. Skript die Übertragungsparameter des COM-Ports. Passen die denn zu der Schnittstelle auf der Gegenseite (also deinem Scanner)?

    Das ist häufig ein Problem bei solchen Verbindungen, das die Einstellungen nicht zusammen passen.

    Jap die passen, Verbindung funktioniert ja auch, halt immer erst, wenn ich das board kurz davor resette. Aber wie gesagt das ist grade nicht das Hauptproblem eigentlich. Ich hab auch gelesen dass diese COMMMG UDF nicht für virtuelle COM Ports ausgelegt sein soll, aber irgendwie find ich nix anderes außer das hier gerade aber das ergibt irgendwie gar keinen Sinn, denn erstens weiß ich nich was byte[6] für ne DLL sein soll xD oder wo die variable herkommt? Komischerweise sagen viele unter dem Post danke funktioniert aber das kann doch gar nich funktionieren so:

    Code
    #include <WinAPI.au3>
    
    $RESULT = _WinAPI_CreateFile(".COM4", 2, 2)
    
    If $RESULT = 0 Then
        MsgBox(16, "", "Port not available, please plug in your device")
    Else
        $tBuffer = DllStructCreate("byte[6]")
        _WinAPI_ReadFile($RESULT, DllStructGetPtr($tBuffer), 6, $nBytes)
        _WinAPI_CloseHandle($RESULT)
        $sText = BinaryToString(DllStructGetData($tBuffer, 1))
        MsgBox(64, "Reading", "This is the output of 6 bytes from COM3: " & $sText)
    EndIf
    Alles anzeigen
  • Verbindung zu ESP8266 Board (RFID Reader) nur nach reset möglich

    • julezrules
    • 26. November 2021 um 10:25

    Guten Morgen,

    Ich bin am Verzweifeln. Ich arbeite zur Zeit an einem Kassensystem mit RFID Karten zur Buchung.

    Ich hab 2 Scanner gebaut bestehend aus jeweils einem Wemos D1 Mini (ESP8266) und einem RC522 RFID Lese Modul.

    Die Scanner lesen die NUID, konvertieren sie zu einem String und senden sie über serial an einen PC. Am PC hab ich jetzt 3 AutoIt Scripts am laufen. 1 Script der die seriellen Daten von Scanner 1 empfängt und in eine Ini schreibt sobald ein neuer Wert erfasst wurde, das selbe nochmal in einem zweiten Script für Scanner 2 und jetzt testweise einen 3. Script der als Monitor dient und quasi die Daten aus der Ini liest und ausgibt.

    Das Ganze funktioniert auch soweit aber NUR wenn ich die boards resette. Sprich, ich verbinde 1 Scanner und starte den Scanner Script. Dann bekomme ich nen Verbindungs-Fehler (cant connect to com port "X"). Wenn ich dann das Wemos D1 Mini Board resette, und den Script nochmal starte läufts. (MANCHMAL auch nur nach Zufallsprinzip irgendwie).

    Ich steh eigentlich vor 2 Problemen jetzt. Einmal würde ich gerne 1 script haben, der gleichzeitig mehrere COM Ports lesen kann, kein Plan wie ich das mache ich blick schon bei dem Script nicht ganz durch (ist aus dem Forum hier glaube ich). Und 2. das Problem mit dem reset. Der PC ist ein alter Windows XP Rechner. Treiber sind korrekt installiert und laufen ja auch. werden auch im Gerätemanager als COM3 und COM4 angezeigt. Kann auch sein dass es am ESP8266 code liegt deswegen hab ich das sowohl hier als auch im ESP8266 forum gepostet. Aber hier mal den Fokus eher auf das erste Problem gelegt,

    WIE kann ich mit 1 Script mehrere COM Ports gleichzeitig auslesen um mir den Mist mit der Ini Datei und den unnötigen 3 scripten die parallel laufen müssen zu ersparen?

    Hier mal die verschiedenen Scripts:

    Scanner Script 1 (scanner script 2 is das gleiche nur anderer COM port):

    Code
    #include <CommMG.au3>
    #RequireAdmin
    
    Global $CMPort = 3
    Global $CmBoBaud = 9600
    Global $sportSetError = ''
    Global $CmboDataBits = 8
    Global $CmBoParity = "none"
    Global $CmBoStop = 1
    Global $setflow = 2
    
    _CommSetPort($CMPort, $sportSetError, $CmBoBaud, $CmboDataBits, $CmBoParity, $CmBoStop, $setflow)
    
    If @error Then
        MsgBox(16, "Error!", "Can't connect to MCU on port - " & $CMPort)
        Exit
    EndIf
    
    _CommSetRTS(0)
    _CommSetDTR(0)
    
    
    While 1
        Local $ret = _CommGetLine(@CR, 100, 100)
        Local $ret2 = StringTrimRight($ret, 1)
        If $ret2 = "" = False Then
            If IniRead("NUID.DAT", "BWK", "nuid", "ini_error") = $ret2 = False Then
                IniWrite("NUID.DAT", "BWK", "nuid", $ret2)
            EndIf
        EndIf
    WEnd
    Alles anzeigen

    Hier mein Debug Script zum Auslesen:

    C
    #include <WindowsConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <EditConstants.au3>
    #RequireAdmin
    
    Global $msg, $gui, $console
    Global $nuid, $old_nuid
    
    
    $gui = GUICreate("DEBUG MONITOR", @DesktopWidth / 2, @DesktopHeight, 0, 0, $WS_POPUP)
    $console = GUICtrlCreateEdit("", 0, 0, @DesktopWidth / 2, @DesktopHeight, $ES_AUTOVSCROLL + $WS_VSCROLL)
    
    GUISetBkColor(0x000000, $gui)
    GUICtrlSetBkColor($console, 0x000000)
    GUICtrlSetColor($console, 0x00ff00)
    GUICtrlSetFont($console, 40, 1000, "", "Courier", 5)
    
    WinSetOnTop("DEBUG MONITOR", "", 1)
    
    While $msg = $GUI_EVENT_CLOSE = False
        $msg=GUIGetMsg()
        GUISetState(@SW_SHOW, $gui)
    
        $nuid = IniRead("NUID.DAT", "BWK", "nuid", "ini_error")
        If $nuid = $old_nuid = False Then
            GUICtrlSetData($console, $nuid & @CRLF, 1)
            $old_nuid = $nuid
            sleep (100)
        EndIf
    WEnd
    Alles anzeigen

    Und falls wir hier noch einen ESP programmierer haben zufällig, der Code vom Scanner (Wemos D1 Mini):

    C
    #include <SPI.h>
    #include <MFRC522.h>
    
    #define SS_PIN D8
    #define RST_PIN D3
     
    MFRC522 rfid(SS_PIN, RST_PIN);
    
    MFRC522::MIFARE_Key key;
    
    void setup() { 
      pinMode(D1, OUTPUT);
      digitalWrite(D1, LOW);
      Serial.begin(9600);
      SPI.begin();
      rfid.PCD_Init();
      rfid.PCD_SetAntennaGain(rfid.RxGain_max);
      Serial.println("B");
      digitalWrite(D1, HIGH);
    }
     
    void loop() {
      if ( ! rfid.PICC_IsNewCardPresent())
        return;
    
      if ( ! rfid.PICC_ReadCardSerial())
        return;
    
      char str[32] = "";
      array_to_string(rfid.uid.uidByte, 4, str);
      Serial.println(str);
      
      rfid.PICC_HaltA();
      rfid.PCD_StopCrypto1();
    }
    
    void array_to_string(byte array[], unsigned int len, char buffer[])
    {
      for (unsigned int i = 0; i < len; i++)
      {
        byte nib1 = (array[i] >> 4) & 0x0F;
        byte nib2 = (array[i] >> 0) & 0x0F;
        buffer[i*2+0] = nib1  < 0xA ? '0' + nib1  : 'A' + nib1  - 0xA;
        buffer[i*2+1] = nib2  < 0xA ? '0' + nib2  : 'A' + nib2  - 0xA;
      }
      buffer[len*2] = '\0';
    }
    Alles anzeigen

Spenden

Jeder Euro hilft uns, Euch zu helfen.

Download

AutoIt Tutorial
AutoIt Buch
Onlinehilfe
AutoIt Entwickler
  1. Datenschutzerklärung
  2. Impressum
  3. Shoutbox-Archiv
Community-Software: WoltLab Suite™