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