Arduino Burn Batch (*.bat zur Portsuche)

Hallo Tommy,

Danke, PN ist verschickt.
Wenn ich auf deinen Namen klicke sehe ich dein Profil.
Das muss man aktiv ausblenden. Defaultmäßig ist das öffentlich für die Statistik.

Ja, auf jeden Fall! Mein Script läuft nun genau so, wie ich es mir gewünscht habe :slight_smile:
Alles was jetzt noch kommt, dient der Auffrischung in der Batch-Programmierung, persönlichen Glückseeligkeit und der Definition von “Hobby”:

Mit größtmöglichem Aufwand, den kleinstmöglichen Nutzen schaffen

:wink:

Eine Datei zu bauen, die VID´s / PID´s und Boardnamen kombiniert klingt super!
Das Optimum wäre ja dann, alle Devices auf Arduinos & ESP´s zu filtern und diese dann zur Auswahl auszugeben.
Werde heute Abend mal meine Registry auslesen (Sitze gerade am neuen, blanken Firmenrechner).

Gerade auch mal schnell geschaut ob es sowas nicht sogar schon gibt:

The Teensy 2, 3.0 and 3.1 are all VID=16C0 and PID=0483
Uno VID=0x2341 and PID=0x0001

Und hier: USB Vendor and Product IDs · Issue #7 · joshmarinacci/arduino-data · GitHub

Guten Morgen,
ich bin ja begeistert.
Leider ist der WAF gestern auf -1 gefallen. Somit bleibt mir nur das nebenbei anzugehen. Also bitte nicht verzweifeln, aber bis zum WE haben wir das zusammen.

Da muss ich Dir widersprechen.
Ich darf Dir zeigen, das batch einiges kann.

@echo off
REM lauft auf WIN7...
setlocal enabledelayedexpansion 
set array[0]=array0
set array[1]=array1
set a[0].name=Name0
set a[0].type=Type0
set a[1].name=Name1
set a[1].type=Type1

for /l %%i in (0,1,1) do ( 
echo Name %%i ist !a[%%i].name!
echo Type %%i ist !a[%%i].type!
echo Array: !array[%%i]!
echo. 
)

Das brauchen wir nicht mehr.
Ich hab mir da mal nen anderen Plan gemacht - Der für Dich gedachte Einsatz ist ja fertig :wink: Jetzt lese ich die PID/VID-Kombi aus der Registry während der Laufzeit aus und arbeite mich daran ab.
Damit fällt auch keine zusätzliche Datei an, die ggfls. gepflegt werden muss.

Heute Nachmittag kommt mal ein erster Entwurf. - ich brauch etwas länger zum schreiben. Die (Schreib-)Fehler kommen ja erst zur Laufzeit zum Vorschein

Danke für die PN’s an alle - das hat mir geholfen meinen Gedankengang zu sortieren.

1 Like

Hallo,

TriB, jetzt müßtest du deine fertige Version nur bitte nochmal zeigen.

my_xy_projekt, ist ja lustig, hatte auf der Suche immer gelesen “geht nicht” bzw. nur über Umwege.

Falls jemand Zeit hat, könnte mir jemand den Syntax der for bitte erklären?
Die Indexvariable ist sicherlich i aber bedeutet /l und die (0,1,1)?
Dann begreif ich vielleicht auch die anderen komplizieren mit den token usw.

for /l %%i in (0,1,1) do (

Kannst Du bitte mal eine DOS-Zeile aufmachen und dort

for /?

eingeben?
Dann immer schön die Anweisung befolgen…

Nichts lieber als das!
Aber vorsicht, das ist erstmal nur für einen Programmer gedacht (Arduino As ISP).
Und auf Optiboot gemünzt. Quasi meine Spielwiese, das ganze Prozedere mit dem avrdude zu verstehen.

Der nächste Schritt wäre dann zu unterscheiden, ob es mein Nano-Programmer ist oder direkt das passende Board. Die avrdude-Parameter variieren dann natürlich.

Ausgabe:

Available COM-Ports:
\Device\Serial2 : USB-SERIAL CH340 (COM5)
\Device\Silabser0 : Silicon Labs CP210x USB to UART Bridge (COM3)

Enter the ComPort Number and press ENTER:

→ 3

1 - Connect Arduino (COM3)
2 - Read Flash (ArduinoBin\backup_flash.hex)
3 - Write Flash (ArduinoBin\backup_flash.hex)
4 - Get Lock Fuses (ArduinoBin\Fuses)
5 - Set Lock Fuses (l:0xFF, h:0xDA, e:0xFD, u:0x3F, lock:0x0F)
6 - Read EEPROM (ArduinoBin\backup_eeprom.hex)
7 - Write EEPROM (ArduinoBin\backup_eeprom.hex)
10 - Burn Bootloader (optiboot_atmega328.hex)
11 - Burn Sketch+Loader (“Sketches\Blink\Blink.ino”)
ELSE - EXIT

Select an action and press ENTER:

Und das Batch-Script:

ECHO OFF
SET BaudRate=115200
SET Programmer=stk500v1
SET Processor=m328p
::FUSES: http://eleccelerator.com/fusecalc/fusecalc.php?chip=atmega328p&LOW=FF&HIGH=DA&EXTENDED=FD&LOCKBIT=0F
SET low_fuses=0xFF
SET high_fuses=0xDA
SET extended_fuses=0xFD
SET unlock_bits=0x3F
SET lock_bits=0x0F
SET "ArduinoFolder=C:\Program Files (x86)\Arduino"
SET FileToBurn=%UserProfile%\Documents\Arduino\Blink\Blink.ino
SET AvrDudeExe="%ArduinoFolder%\hardware\tools\avr\bin\avrdude.exe"
SET AvrDudeConf="%ArduinoFolder%\hardware\tools\avr\etc\avrdude.conf"
SET BootLoaderFile="%ArduinoFolder%\hardware\arduino\avr\bootloaders\optiboot\optiboot_atmega328.hex"
SET BinaryAndBootloaderFile=%FileToBurn%.with_bootloader.arduino_standard.hex
SET BinFolder=ArduinoBin\
SET FlashFile=%BinFolder%backup_flash.hex
SET EepromFile=%BinFolder%backup_eeprom.hex
SET FusesFolder=%BinFolder%Fuses\

CLS

@echo off & setlocal enabledelayedexpansion 
set _ports=0
set _key="HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\SERIALCOMM"
for /f "tokens=3 delims= " %%i in ('reg query !_key! ^| find /v "HKEY"') do (
   set "ComPort=%%i" & set /a "_ports+=1")

IF %_ports% EQU 0 GOTO NoComAvailable
IF %_ports% EQU 1 GOTO LOOP
IF %_ports% GTR 1 GOTO SelectComPort

:NoComAvailable
ECHO No COM-Port found!
Pause
GOTO EXIT

:SelectComPort
ECHO Available COM-Ports:
@echo off & setlocal enabledelayedexpansion 
set _key="HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\SERIALCOMM"
for /f "tokens=1,3 delims= " %%i in ('reg query !_key! ^| find /v "HKEY"') do (
   set "_device=%%i" & set "_com#=%%j" & (for /f "tokens=*" %%a in ('wmic path win32_pnpentity get caption /format:table^| find "!_com#!"') do (set _desc=%%a)) & echo/	!_device! :	!_desc!)
@ECHO,
SET /P P=Enter the ComPort Number and press ENTER:
SET ComPort=COM%P%

:LOOP
SET M=""
ECHO OFF
CLS
ECHO  1 - Connect Arduino	(%ComPort%)
ECHO  2 - Read Flash		(%FlashFile%)
ECHO  3 - Write Flash	(%FlashFile%)
ECHO  4 - Get Lock Fuses	(%FusesFolder%)
ECHO  5 - Set Lock Fuses	(l:%low_fuses%, h:%high_fuses%, e:%extended_fuses%, u:%unlock_bits%, lock:%lock_bits%)
ECHO  6 - Read EEPROM	(%EepromFile%)
ECHO  7 - Write EEPROM	(%EepromFile%)
for %%F in (%BootLoaderFile%) do ECHO 10 - Burn Bootloader	(%%~nxF)
ECHO 11 - Burn Sketch+Loader	(%FileToBurn%)
ECHO ELSE - EXIT
ECHO.

SET /P M=Select an action and press ENTER:
IF %M%==1 GOTO CONNECT
IF %M%==2 GOTO READ_FLASH
IF %M%==3 GOTO WRITE_FLASH
IF %M%==4 GOTO GETLOCK
IF %M%==5 GOTO SETLOCK
IF %M%==6 GOTO READ_EEPROM
IF %M%==7 GOTO WRITE_EEPROM
IF %M%==10 GOTO BURN_BOOTLOADER
IF %M%==11 GOTO BURN_BOARD
GOTO EXIT

:CONNECT
%AvrDudeExe% -P %ComPort% -b %BaudRate% -c %Programmer% -p %Processor% -C %AvrDudeConf% -v -F
Pause
GOTO LOOP
:SETLOCK
%AvrDudeExe% -P %ComPort% -b %BaudRate% -c %Programmer% -p %Processor% -C %AvrDudeConf% -U lock:w:0x%lock_bits%:m -U lfuse:w:0x%low_fuses%:m -U hfuse:w:0x%high_fuses%:m -U efuse:w:0x%extended_fuses%:m
Pause
GOTO LOOP
:GETLOCK
IF NOT EXIST %FusesFolder% ( MD %FusesFolder%)
%AvrDudeExe% -P %ComPort% -b %BaudRate% -c %Programmer% -p %Processor% -C %AvrDudeConf% -Ulfuse:r:%FusesFolder%lfuse.h:h -Uefuse:r:%FusesFolder%efuse.h:h -Uhfuse:r:%FusesFolder%hfuse.h:h -Ulock:r:%FusesFolder%lock.h:h
Pause
GOTO LOOP
:READ_FLASH
%AvrDudeExe% -P %ComPort% -b %BaudRate% -c %Programmer% -p %Processor% -C %AvrDudeConf% -U flash:r:%FlashFile%:r
Pause
GOTO LOOP
:WRITE_FLASH
%AvrDudeExe% -P %ComPort% -b %BaudRate% -c %Programmer% -p %Processor% -C %AvrDudeConf% -U flash:w:%FlashFile%:r
Pause
GOTO LOOP
:READ_EEPROM
%AvrDudeExe% -P %ComPort% -b %BaudRate% -c %Programmer% -p %Processor% -C %AvrDudeConf% -U eeprom:r:%EepromFile%:r
Pause
GOTO LOOP
:WRITE_EEPROM
%AvrDudeExe% -P %ComPort% -b %BaudRate% -c %Programmer% -p %Processor% -C %AvrDudeConf% -U eeprom:w:%EepromFile%:r
Pause
GOTO LOOP
:BURN_BOOTLOADER
%AvrDudeExe% -P %ComPort% -b %BaudRate% -c %Programmer% -p %Processor% -C %AvrDudeConf% -F -e -U flash:w:%BootLoaderFile%:i
Pause
GOTO LOOP
:BURN_BOARD
 %AvrDudeExe% -P %ComPort% -b %BaudRate% -c %Programmer% -p %Processor% -C %AvrDudeConf% -F -e -U flash:w:%BinaryAndBootloaderFile%:i -U lock:w:0x%lock_bits%:m -U lfuse:w:0x%low_fuses%:m -U hfuse:w:0x%high_fuses%:m -U efuse:w:0x%extended_fuses%:m
Pause
GOTO LOOP
:EXIT

Ist etwas “historisch gewachsen” :sweat_smile:

2 Likes

Der Ansatz funktionert!
Meiner hat sogar gegenüber der Abfrage der reinen benutzten seriellen Ports

noch den Vorteil, das durch die Prüfung mit “mode” nicht nur der Port als solches übernommen wird, sondern bei “busy” bleibt der ausgeblendet.
Wer z.B. wie ich den SerMon noch am laufen hat findet kein verfügbares Gerät.
Auch werden keine weiteren Perepherien gefunden.

Wer möchte, kann in Zeile 8 das :: vor dem echo entfernen.

Die nächsten Schritte ist die Übernahme der Eintragungen in ein Array und die Erweiterung auf VID/PID und SerNum/ID
Ich hab das extra voll modular gehalten und in einzelnen Sprungmarken unterteilt…

Na dann…

@echo off
setlocal EnableExtensions enabledelayedexpansion
REM den gesamten Registryzweig ...
set "RegistryPath=HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\USB"
REM ... auslesen und zur Weiterverarbeitung jeden Eintrag uebergeben
for /F "delims=" %%I in ('reg.exe QUERY "%RegistryPath%"') do (
REM uebergibt den kompletten Registrypath mit VID/PID:
	:: echo. %%I
	call :getVendor "%%I"
)
endlocal
goto :EOF

:getVendor
REM uebergibt Path mit ID/Seriennummer
for /F "delims=" %%I in ('reg.exe QUERY %1') do (
	call :setVar "%%I"
)
goto :EOF

:setVar
REM holt die Angaben zum Namen des Boards
for /F  "tokens=1,2* delims= " %%A in ('reg.exe QUERY %1 /s') do (
    if /I "%%A" == "FriendlyName" (
		set "_name=%%C" 
		REM holt die Angaben zum Port des Boards
		for /F "skip=2 tokens=1,3" %%D in ('reg.exe QUERY "%~1\Device Parameters" /v PortName 2^>nul') do (
			if /I "%%D" == "PortName" (
			set "_port=%%E"
			echo. port %%E fuer Board %%C gefunden
			)
		)
	)
)
if #%_port% NEQ # goto checkPort 	
goto :EOF

:checkPort
REM Test, ob das Board angeschlossen ist
mode %_port%: | findstr "%_port%:" >>NULL
if %ERRORLEVEL% GTR 0 (
	echo. kein COMPort!
	SET _port=
	SET _name=
)
if #%_port% NEQ # goto printVar
goto :EOF

:printVar
echo.
echo. Gefunden: %_name% an COMPort %_port%:
SET _name=
SET _port=
goto :EOF

Ausgabe hier:

 port COM5 fuer Board USB-SERIAL CH340 (COM5) gefunden
 kein COMPort
 port COM7 fuer Board USB-SERIAL CH340 (COM7) gefunden
 kein COMPort
 port COM6 fuer Board Arduino Mega 2560 (COM6) gefunden
 kein COMPort
 port COM4 fuer Board Arduino Mega 2560 (COM4) gefunden
 kein COMPort
 port COM3 fuer Board Arduino Uno (COM3) gefunden

 Gefunden: Arduino Uno (COM3) an COMPort COM3:
2 Likes

Hallo,

Danke TriB, muss ich mal durcharbeiten.

@ my_xy, ob das Board angeschlossen ist oder nicht wurde doch schon auch so erkannt. War jedenfalls bei mir so mit älteren Code. Wenn nicht angesteckt wird es nicht aufgelistet. Aber ich will jetzt nicht dazwischen funken.

Ja.
Das ist richtig.
Aber wenn es angeschlossen ist UND in Benutzung durch den SerMon, durch ein Terminalprogramm oder what ever, wird es eben auch aufgelistet.
Probier es aus.
Ich hab mir hier 20 Minuten die Karten gelegt, weil ich noch den UNO auf dem SerMon/Terminal am laufen hatte. Damit wäre er zwar physisch da, aber nicht verfügbar.

Moin,

ich hab das mal fertig gemacht.
Wie solls jetzt weiter gehen? Wünsche?

@echo off
cls
setlocal EnableExtensions enabledelayedexpansion
REM Laufende Nummer fuer aktiven Datensatz
set numA=0 
REM laufende Nummer fuer inaktiven Datensatz
set numI=0
REM den gesamten Registryzweig ...
set "RegistryPath=HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\USB"
REM ... auslesen und zur Weiterverarbeitung jeden Eintrag uebergeben
for /F "delims=" %%I in ('reg.exe QUERY "%RegistryPath%"') do (
REM uebergibt den kompletten Registrypath mit VID/PID:
	call :getVendor "%%I"
)
goto printVar
endlocal
goto :EOF

:getVendor
REM uebergibt Path mit ID/Seriennummer
for /F "delims=" %%I in ('reg.exe QUERY %1') do (
	call :setVar "%%I"
)
goto :EOF

:setVar
REM holt die Angaben zum Namen des Boards
for /F  "tokens=1,2* delims= " %%A in ('reg.exe QUERY %1 /s') do (
    if /I "%%A" == "FriendlyName" (
		set "_name=%%C" 
		REM holt die Angaben zum Port des Boards
		for /F "tokens=1,3" %%D in ('reg.exe QUERY "%~1\Device Parameters" /v PortName') do (
			if /I "%%D" EQU "PortName" (
			set "_port=%%E"
			)
		REM holt die VID/PID und Seriennummer/ID
		for /F "tokens=6,7 delims='\' " %%F in ("%~1") do (
			set _pid=%%F
			set _id=%%G
			)	
		)
	)
)
if #%_port% NEQ # (
goto checkPort 	
)
goto :EOF

:checkPort
REM Test, ob das Board angeschlossen ist
mode %_port%: | findstr "%_port%:" >>NULL
if %ERRORLEVEL% GTR 0 (
	REM baut Datensatz fuer nicht angeschlossene Boards
	set /a numI=%numI%+1
	set _deviceI[!numI!].Name=!_name!
	set _deviceI[!numI!].Pid=!_pid!
	set _deviceI[!numI!].ID=!_id!
	set _deviceI[!numI!].Port=!_port!
	echo.
	) else (
	REM baut Datensatz fuer aktive Boards
	set /a numA=%numA%+1
	set _deviceA[!numA!].Name=!_name!
	set _deviceA[!numA!].Pid=!_pid!
	set _deviceA[!numA!].ID=!_id!
	set _deviceA[!numA!].Port=!_port!
	)
)
set _port=
set _name=
goto :EOF

:printVar
if %numI% GTR 0 (
	Echo. Nicht verfuegbare Boards gefunden:
	Echo.
	for /l %%i in (1,1,%numI%) do ( 
		Echo. !_deviceI[%%i].Name! !_deviceI[%%i].ID! 
		REM !_deviceI[%%i].Pid! !_deviceI[%%i].Port! 
	)	
)
Echo.
if %numA% GTR 0 (
	Echo. Angeschlossene Boards gefunden:
	Echo.
	for /l %%i in (1,1,%numA%) do ( 
		Echo. !_deviceA[%%i].Name! !_deviceA[%%i].Pid! !_deviceA[%%i].ID! an !_deviceA[%%i].Port!:
	)
)
Echo.
goto :EOF

Hallo,

will ja nichts sagen, aber damit wird nichts ausgegeben. Der Cursor springt kurz paar Zeilen runter, dann geht das Fenster zu. ‘grübel’

Und wegen Wünschen. Ich dachte ja, deswegen meine Idee mit der Datei auslesen bzw. deine mit dem Array, dass ein angegebener Boardname mit angezeigt wird. Weil sonst beim Uno und Mega nichts sagende Angaben angezeigt werden. Außer man ändert das in der Registry, wobei ich nicht weiß wie lange die Änderung überlebt.

Fehlt hier nicht eine Variable für set?

set "RegistryPath=HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\USB"

Oder sollte das so sein?

set RegistryPath = "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\USB"

Ich bin ja davon ausgegangen, das Du das auf der Console startest :wink:
sieht dann so aus:
grafik
Lässt sich aber umgehen.
Die letzten Beiden Zeilen (90/91) lauten:
Echo.
goto :EOF
Dazwischen schreibe eine neue Zeile:
Pause

Der Registrypath passt so - und so.

Das mit dem Datei auslesen nehme ich in den nächsten Puzzleteilen mit.

Bist Du mit dem for weitergekommen? Das mit den Token ist eigentlich ne simple Sache, aber manchmal muss ich auch probieren, wenn die delims nicht passen…

[edit]da hier noch nichts neues:

Ich hab mal eine Zeile zerlegt und das aufgelöst:

%ardupath%\avr/bin/avrdude -C%ardupath%\avr/etc/avrdude.conf -v -p[%%.build.mcu] -c[%%.build.protocol] -P[%Port%] -b[%%.upload.speed] -D -Uflash:w:[/HEXFILE/]:i 

Dabei kommen aus der Board.txt:

[%%.build.mcu]
[%%.build.protocol]
[%%.upload.speed]

Der %ardupath% wird irgendwie festgelegt
Für das %% die PID-VID-Kombi aus der Registry nutzen um den Type in der Board.txt rauszubekommen
Für %PORT% kommt der aus der Registry
Das Flashfile müssen wir sehen, wie wir das lösen…

Bin ich auf der richtigen Seite?
[/edit]

Hallo,

pause hatte ich an der falschen Stelle, hinter EOF. :rofl:
Wegen der for, ich wurschtel mich da irgendwie durch. C/C++ Syntax wäre mir lieber.

Ich sehe in deiner Ausgabe du hast auch die Registry manipuliert. :wink:

Interessant ist aktuell das mit der S/N. Daran kann man ein bestimmtes Board genau identifizieren und nicht nur pauschal das Arduino Modell.
Demnach bräuchte man keine VID/PID etc. zu hinterlegen sondern nur die S/N und dann einen Namen festlegen der bei einem Treffer ausgegeben werden soll. Ob nun extra Datei oder Array, was einfacher ist. Bin begeisert wie du das so machst. :grinning:

Dann musst Du zu jeder SN auch die Konfigdaten hinterlegen.
Wenn Du mal auf die schnelle was machen willst, dann kannst kein frisches Board nehmen, sondern erst die Parameter anlegen.

Da mir der WIN-Rechner gleich wieder entzogen, mache ich da morgen weiter.

Nur noch mal ne Bitte:
Welche Parameter braucht ihr aus der Boards.txt die dem Dudel übergeben werden soll?

Ach da war ja noch was…

Es geht sowohl so als auch so, aber dann musst während der Laufzeit die “” entfernen.
In meiner Variante könnte ich mit Spaces arbeiten, bekomme während der Laufzeit aber keine Gändefüschen.

Hallo,

die S/N ist vom frischen Board schnell mit der IDE ausgelesen und in die Batch eingetragen. Zudem man nicht ständig neue Boards nimmt. :wink:

Die Idee war, wenn man mehrere gleiche Boards hat, dann kann man die mit der S/N unterscheiden. Dann kann man die Boards endlich eindeutig beschriften und findet das in der Ausgabe wieder, wenn man das hinterlegt. Das war bis jetzt nicht möglich wenn die ComPort Nummer wechselt.

Guter Einwand.
Denke ich drüber nach, nehm das mal mit…

Hallo,

ich glaube das Schema F habe ich erstmal soweit verstanden, ich konnte einen weiteren Vergleich einbauen. SN sind hinterlegt und werden am Ende verglichen und dann angezeigt welches Board es ist mit oben hinterlegten Namen.

@echo off

set board[0].sn=9520000
set board[0].name=Mega2560.1
set board[1].sn=9540000
set board[1].name=Mega2560.2
set board[2].sn=A940000
set board[2].name=NanoEvery.1
set boardmaxIndex=2
set numB=0;

cls
setlocal EnableExtensions enabledelayedexpansion
REM Laufende Nummer fuer aktiven Datensatz
set numA=0 
REM laufende Nummer fuer inaktiven Datensatz
set numI=0
REM den gesamten Registryzweig ...
set RegistryPath="HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\USB"
REM ... auslesen und zur Weiterverarbeitung jeden Eintrag uebergeben
for /F "delims=" %%I in ('reg.exe query "%RegistryPath%"') do (
REM uebergibt den kompletten Registrypath mit VID/PID:
	call :getVendor "%%I"
)
goto printVar
endlocal
goto :EOF

:getVendor
REM uebergibt Path mit ID/Seriennummer
for /F "delims=" %%I in ('reg.exe QUERY %1') do (
	call :setVar "%%I"
)
goto :EOF

:setVar
REM holt die Angaben zum Namen des Boards
for /F  "tokens=1,2* delims= " %%A in ('reg.exe QUERY %1 /s') do (
    if /I "%%A" == "FriendlyName" (
		set "_name=%%C" 
		REM holt die Angaben zum Port des Boards
		for /F "tokens=1,3" %%D in ('reg.exe QUERY "%~1\Device Parameters" /v PortName') do (
			if /I "%%D" EQU "PortName" (
			set "_port=%%E"
			)
		REM holt die VID/PID und Seriennummer/ID
		for /F "tokens=6,7 delims='\' " %%F in ("%~1") do (
			set _pid=%%F
			set _id=%%G
			)	
		)
	)
)
if #%_port% NEQ # (
goto checkPort 	
)
goto :EOF

:checkPort
REM Test, ob das Board angeschlossen ist
mode %_port%: | findstr "%_port%:" >>NULL
if %ERRORLEVEL% GTR 0 (
	REM baut Datensatz fuer nicht angeschlossene Boards
	set /a numI=%numI%+1
	set _deviceI[!numI!].Name=!_name!
	set _deviceI[!numI!].Pid=!_pid!
	set _deviceI[!numI!].ID=!_id!
	set _deviceI[!numI!].Port=!_port!
	echo.
	) else (
	REM baut Datensatz fuer aktive Boards
	set /a numA=%numA%+1
	set _deviceA[!numA!].Name=!_name!
	set _deviceA[!numA!].Pid=!_pid!
	set _deviceA[!numA!].ID=!_id!
	set _deviceA[!numA!].Port=!_port!
	)
)
set _port=
set _name=
goto :EOF

:printVar
if %numI% GTR 0 (
	Echo. Nicht verfuegbare Boards gefunden:
	Echo.
	for /l %%i in (1,1,%numI%) do ( 
		Echo. !_deviceI[%%i].Name! !_deviceI[%%i].ID! 
		REM !_deviceI[%%i].Pid! !_deviceI[%%i].Port! 
	)	
)
Echo.
if %numA% GTR 0 (
	Echo. Angeschlossene Boards gefunden:
	Echo.
	for /l %%i in (1,1,%numA%) do ( 
		Echo. !_deviceA[%%i].Name! !_deviceA[%%i].Pid! !_deviceA[%%i].ID! an !_deviceA[%%i].Port!:
        REM bei Treffer eigene Bezeichnung  ausgeben
        for /l %%b in (0,1,%boardmaxIndex%) do ( 
            if !_deviceA[%%i].ID! EQU !board[%%b].sn! (
                Echo. !board[%%b].name!
             )
         )
    )
)
Echo.
pause
goto :EOF

Das sieht so erstmal schick aus.
Setzt aber voraus, das das Board in der Batch liegt - ok, das lasse mal liegen, ich hatte dir ne PM geschickt wie das auslesen aus der Boards.txt gehen kann. Da häng ich mich morgen weiter ran.

Bevor Du weiter machst… Wenn Du eine Variable systemweit anlegst (Zähler) dann nutze den ersten Index nicht! Das fällt Dir früher oder später auf die Füsse.
Eine angelegte Variable numB mit 0 kannst Du inhaltlich nur vergleichen wenn Du später prüfst ob numB GTR 0 ist.
0 ist immer da - wenn Du einen wirklichen Datensatz hast, dann vorher addieren. Sieh Dir das bei mir an.

Dann verwende keine Delemiter für Bezeichnungen.

board[0].name=Mega2560.1

Der Punkt . wird ggfls an anderer Stelle als Trennzeichen genutzt. Das fällt Dir irgendwann auch auf die Füsse, wenn Du einen String zusammensetzt und dann ein for drüber läuft.

Wenn Du das weiter verfolgen und Batch machen willst, generiere für alle angeschlossenen Boards ein(!) zusätzliches Feld. In dem solll nur ein Eintrag drin sein.
Also nicht erst bei der Ausgabe (:printVar) sondern schon zum Zeitpunkt, wo der Datensatz gebaut wird.
Hast Du einen Eintrag bei Dir, wird der übernommen, wenn Du keinen Eintrag hast, kommt irgendwas in Richtung “NUL” rein…

Mir fehlt noch immer das, was Du aus einer externen Datei lesen willst, was ggfls. nicht in der Boards.txt steckt.
(Ausser der eigenen Bezeichnung)

Hallo,

Danke für die Tipps.
In der externen Datei hätte ich das untergebracht was ich hier am Anfang als Array definiert habe nur eben in Zeilen. Also SN und eine aussagekräftige eigene Bezeichnung. Weil ich damals noch nicht wußte das es Arrays gibt.
Die PN habe ich erhalten. Danke.
Das mit der Board.txt auslesen klappt . Nur wie gesagt, da stehen keine SN’s drin. Da würde mir die genaue Unterscheidung fehlen. Mal angenommen ich hätte 10 gleiche Megas und möchte einen speziellen davon flashen, dann muss ich wissen welchen ich flashe. Außer ich möchte alle mit dem gleichen Sketch flashen.
Da fällt mir ein, es gab mal eine Anfrage wo ein Lehrer immer alle angeschlossenen Arduinos mit dem gleichen Sketch flashen wollte. Ihm konnte damals nicht geholfen. Mit der Batch hier ginge das. Es kommt also auch darauf an zu welchen Zeitpunkt man seine Frage stellt.

Da hat ja TriB was ins Leben gerufen mit Batch Programmierung. :+1: :grinning:
Wozu brauch man jetzt noch C/C++? :rofl: :crazy_face:

Für die Fehlerkorrektur?
Während der Compiler schon merkt, wo es hakt, bekommst Du das bei Batch erst zur Laufzeit mit.

Spätestens, wenn Du so Ausgaben wie “Syntaxfehler” oder gar ) bekommst, dann viel Spass…
Du hast Post. :wink: