Da hier nichts mehr passiert, mach ich den Sack zu.
Es gibt einen Testsketch:
void setup() {
Serial.begin(115200);
delay(300);
Serial.println(F("Start..."));
Serial.write(0x1A);
pinMode(LED_BUILTIN, OUTPUT);
}
void loop() {
getSerialSwitch();
}
void getSerialSwitch()
{
if (Serial.available())
{
char c = Serial.read();
if (isPrintable(c))
{
switch (c)
{
case '0': digitalWrite(LED_BUILTIN, LOW); break;
case '1': digitalWrite(LED_BUILTIN, HIGH); break;
}
Serial.print(F("DigitalPin "));
Serial.print(LED_BUILTIN);
Serial.print(F(" ist "));
if (digitalRead(LED_BUILTIN))
Serial.println(F("EIN"));
else
Serial.println(F("AUS"));
}
Serial.write(0x1A);
}
}
Dazu die folgende Batch. Im oberen Teil ist klar, was definiert werden muss.
@ECHO off & setlocal enabledelayedexpansion
:START
::::::::::::::::::
:: DEINE DATEN ::
::::::::::::::::::
SET MYVID=2A03
SET MYPID=0043
:: Wennn keine Seriennummer eingetragen, wird nur auf PID/VID geprüft
SET MYSER=
:: Daten der Schnittstelle
SET MYBAUD=115200
SET MYPARITY=n
SET MYDATA=8
SET MYSTOP=1
:: wenn nichts übergeben sende diesen Parameter (0 oder 1)
SET default=1
:: Reset des Controllers auslösen (wenn LEER == inaktiv)
SET reset=
:: Ergebnis vom Controller empfangen (wenn LEER == inaktiv # Achtung dauert etwas!)
SET receive=1
::::::::::::::::::::::::::::::::
:: AB HIER NICHTS MEHR ÄNDERN ::
::::::::::::::::::::::::::::::::
MODE con: cols=140 lines=80
:: Übergabeparameter merken
SET para=%1
:: War nicht 1
IF "!para!" NEQ "1" (
:: War auch nicht 0
IF "!para!" NEQ "0" (
:: defaultwert setzen
SET para=%default%
) )
:: Das lesen der Registry dauert evtl.!
:: Jeder lesevorgang macht einen Punkt
SET _point=*
:: Laufende Nummer fuer Datensatz
SET _num=0
:: den gesamten Registryzweig ...
SET "RegistryPath=HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\USB"
:: ... auslesen und zur Weiterverarbeitung jeden Eintrag uebergeben
FOR /F "delims=" %%I in ('reg.exe QUERY "%RegistryPath%"') do (
:: uebergibt den kompletten Registrypath mit VID/PID:
CALL :getVendor "%%I"
)
CALL :printBoard
CALL :execute
:: ENDE Programm
endlocal
GOTO :bye
:getVendor
CLS
ECHO. Suche aktive Schnittstelle %_point%
SET _point=%_point%*
:: uebergibt Path mit ID/Seriennummer
FOR /F "delims=" %%I in ('reg.exe QUERY %1 ') do (
CALL :setVar "%%I"
)
:: Ende getVendor
GOTO :EOF
:setVar
:: holt die Angaben zum Namen des Boards
FOR /F "tokens=1,2* delims= " %%A in ('reg.exe QUERY %1 /v FriendlyName 2^>NUL') do (
SET "_name=%%C"
:: holt die Angaben zum Port des Boards
FOR /F "tokens=1,3*" %%D in ('reg.exe QUERY "%~1\Device Parameters" /v PortName 2^>NUL' ) do (
SET "_port=%%E"
:: holt die VID/PID und Seriennummer/ID
FOR /F "tokens=6,7 delims='\' " %%F in ("%~1") do (
SET _pidvid=%%F
SET _id=%%G
) ) )
IF #%_port% NEQ # (
GOTO checkPort
)
:: Ende setVar
GOTO :EOF
:checkPort
:: Test, ob das Board angeschlossen ist
MODE %_port%: | findstr "%_port%:" >NULL
IF %ERRORLEVEL% EQU 0 (
:: teilt pidvid auf
FOR /F "tokens=2,4 delims='&_' " %%A in ("!_pidvid!") do (
SET _pid=%%B
SET _vid=%%A
)
:: baut Datensatz fuer aktive Boards
SET /a _num=%_num%+1
SET _device[!_num!].Name=!_name!
SET _device[!_num!].Pid=!_pid!
SET _device[!_num!].Vid=!_vid!
SET _device[!_num!].ID=!_id!
SET _device[!_num!].Port=!_port!
)
set _port=
set _name=
:: Ende checkPort
GOTO :EOF
:: REGISTRY ENDE
:printBoard
IF %_num% GTR 0 (
ECHO. Aktive Schnittstelle^(n^) gefunden:
ECHO.
FOR /l %%i in (1,1,%_num%) do (
ECHO. %%i - !_device[%%i].Name! mit ID !_device[%%i].ID! an Schnittstelle !_device[%%i].Port!: # VID:!_device[%%i].vid! # PID:!_device[%%i].Pid!
)
) ELSE (
ECHO. KEIN angeschlossenes Board gefunden
)
ECHO.
:: ENDE printBoard
GOTO :EOF
:execute
:: zählt durch alle Elemente
FOR /l %%i in (1,1,!_num!) do (
:: überprüft PID, VID, Seriennummer
IF !_device[%%i].Pid! EQU !MYPID! (
IF !_device[%%i].Vid! EQU !MYVID! (
:: Wenn Seriennummer vorhanden
IF DEFINED MYSER (
:: Wenn Seriennummer übereinstimmt
IF !_device[%%i].ID! EQU !MYSER! (
SET prog=true
)
) ELSE (
:: Wenn keine Seriennummer vorgegeben
SET prog=true
) ) )
:: Wenn freigegeben
IF DEFINED prog (
:: wenn reset aktiv besonderer HINWEIS
IF DEFINED reset (
SET _dtr=ON
SET receive=ON
COLOR F4
ECHO. ACHTUNG: Controller wird resettet! Pin geht in default!
) ELSE (
:: reset verhindern
SET _dtr=OFF
)
:: wenn alles passt dann loslegen
MODE !_device[%%i].Port!: baud=!MYBAUD! parity=!MYPARITY! data=!MYDATA! stop=!MYSTOP! dtr=!_dtr! rts=OFF to=ON
:: sendet befehl
ECHO. . !para! > !_device[%%i].Port!:
:: wartet auf Antwort
IF DEFINED receive (
TYPE !_device[%%i].Port!:
ECHO.
) ) )
GOTO :EOF
:bye
COLOR
Pause
Schliesslich sieht das dann so aus:
Die ID des UNO ist rausradiert

Das Skript läuft vollständig automatisch.
Wenn eine 0 übergeben wird, wird eine 0 gesendet, wenn eine 1 übergeben wird, wird eine 1 gesendet.
Wenn nichts übergeben wird, kann im Skript festgelegt werden, wass passieren soll. - Aktuell sendet er eine 1.
HINWEIS: Die Quittung braucht sehr lange.