AVRDude beim Kunden

Gast #6684865
Lesenswert?

Hallo Foraner,

für Firmware-Updates habe ich dem Kunden einen Adapter mit "Arduino as 
ISP" zur Verfügung gestellt. OS ist Windows. Zu Hause kann ich 
problemlos die Firmware brennen, aber für den Kunden möchte ich das 
vereinfachen:

1. muss man in der Komandozeile jeweils die verwendete COM angeben, kann 
man das vereinfachen? Gibt es was wie "AVR Burn-o-Mat", aber in gut? Das 
Ziel wäre schon, dass der Kunde einfach ein .bat starten kann, und der 
Vorgang durchläuft. Maximal einmalig die COM angeben muss.

2. habe ich das Problem, dass der "Arduino as ISP" jeweils nach dem 
ersten Anstecken beim ersten Kommando einen Fehler ergibt. Ich vermute, 
dass da noch Zeichen in einem Puffer stecken. Kennt wer das Problem, und 
wie kann man das umgehen? Mein Workaround wäre ein Dummy-Read als erstes 
Kommando...

Danke und Gruss Chregu
Gast #6684882
Lesenswert?

N. M. schrieb:
> Du kannst ja ein BAT schreiben dass den COM Port von einer
> Umgebungsvariablen zieht. Dann muss er die Variable nur einmalig
> anlegen.

Das ist ungeeignet da sich der Port über die Stunden, Tage,
Wochen verändern kann. Aktuelle, dynamische Findung ist
angesagt, aber mit einem Arduino nicht ganz einfach. Man
müsste alle Ports abscannen und eine für den Arduino typische
Bootloader Signatur finden.
#6684893
Lesenswert?

aduinoistschööön schrieb:
> Das ist ungeeignet

Ich finde das ganze Konstrukt ungeeignet, bei einem Kunden mit Arduino 
as ISP rumzuspielen.
Es genügt aber seinen Anforderungen solange der Arduino as ISP nicht neu 
enumeriert wird.

Chregu schrieb:
> Das Ziel wäre schon, dass der Kunde einfach ein .bat starten kann, und
> der Vorgang durchläuft. Maximal einmalig die COM angeben muss.
#6685114
Lesenswert?

Kunden-"Lösung" mit einem Rotzekacke-Gemisch aus Arduinos, Windows 
COM-Ports und BAT-Files? Na Mahlzeit :( Eine Runde Mitleid für deinen 
Kunden.

Soweit ich weiß - vielleicht hat sich das geändert - bekommt man Zugriff 
auf die COM-Port Benennung über eine Treiber-API Namens "COM Port 
Database". 
https://docs.microsoft.com/en-us/windows-hardware/drivers/serports/com-port-database 
Aber das hilft dir aus einer BAT-Datei wenig. Was du machen kannst ist 
die Registry untersuchen. Das geht, mit viel Gebastel, auch auch aus 
einer BAT-Datei raus.
1
reg query "HKLM\SYSTEM\CurrentControlSet\Control\COM Name Arbiter" /s

liefert die aktuellen Daten des COM Name Arbiters.  ComDB ist eine 
Bitmaske die beschreibt welche COM-Ports vergeben sind (schwer mittels 
BAT zu analysieren). Aber die Schlüssel unter Devices sind die 
einzelnen, bekannten COM-Ports. Bei COM-Ports von USB-Geräten steht dort 
u.a. die USB VID und PID und anderes Zeug.

Wenn du mehr Infos über das Gerät brauchst, mit der VID und PID kannst 
du dann unter der Geräte-Enumeration nach dem Gerät suchen. Dazu 
bastelst du dir einen Registry-Schlüssel der Form 
HKLM\SYSTEM\CurrentControlSet\Enum\USB\VID_<VID Nummer>&PID_<PID Nummer> 
Unter dem Schlüssel findest du alle Instanzen der jeweiligen Hardware. 
Für jede Instanz gibt es unter anderem den FriendlyName, in dem noch 
mal der COM-Port steht.

Weiter findest du die COM-Ports auch unter
1
reg query HKLM\HARDWARE\DEVICEMAP\SERIALCOMM /s

Dort aber ohne große Zusatzinfos.

Viel "Spaß" das mit den Mitteln eines Windows Batch-Jobs auszuwerten.
Gast #6687871
Lesenswert?

Falls die Herausforderung noch aktuell ist ...

Im Zeitalter der Comports, die über einen USB-Konverter simuliert werden 
gibt es ja noch eine andere Möglichkeit den Kunden-Comport zu bestimmen: 
Man lässt den Kunden/Anwender die USB-Verbindung einfach unmittelbar vor 
dem Flashen verbinden. Der neu dazugekommene Comport ist der zu 
benutzende.

Ich habe dazu ein kleines Kommandozeilenprogramm geschrieben, das dieses 
Prinzip verwendet. Die Nummer des Comports wird als Errorlevel 
zurückgegeben und ist in einer Batch universell verwendbar.

Bei Interesse einfach mal das herunterladen:
https://www.franksteinberg.de/ZIPS/eRpmMeter.zip

Hier wird ein Brushless-Drehzahmesser-Firmware automatisiert auf einen 
Arduino-Uno geladen (Batch starten - USB nach Aufforderung verbinden - 
Flashvorgang beginnt automatisch). Enthalten ist neben der hier nicht 
interessierenden Firmware das besagte Kommandozeilenprogramm 
(SayNewComPort.exe) nebst Quelltext in FreeBasic und die steuernde 
Batch. Brauchst du nur an deine Bedürfnisse anpassen.

Vielleicht hilft es ja
Frank
Gast #6688148
Lesenswert?

Steini63 schrieb:
> Man lässt den Kunden/Anwender die USB-Verbindung einfach unmittelbar vor
> dem Flashen verbinden. Der neu dazugekommene Comport ist der zu
> benutzende.
Das ist vermutlich auch das Prinzip, welches viele Gerätetreiber 
verwenden, bei denen erst an einem bestimmten Punkt der 
Treiberinstallation das Gerät angesteckt werden darf...
#6689034
Lesenswert?

Bernd schrieb:
> Das ist vermutlich auch das Prinzip, welches viele Gerätetreiber
> verwenden, bei denen erst an einem bestimmten Punkt der
> Treiberinstallation das Gerät angesteckt werden darf...

Kann ich mir gut vorstellen. Jedenfalls scheint die Ermittlung des 
benutzten Comports so ziemlich DAU-sicher zu sein. Außerdem geht es 
schneller, als im Gerätemanager zu suchen und das Ergebnis dann 
irgendeiner Software einzutragen. Null-Click-Bedienung sozusagen.

Frank
Gast #6689342
Lesenswert?

Schon mal über ein "field programmer" nachgedacht? Ein uC der ein 
anderen wenn angeschlossen flashed. Das sollte sogar ein trainierter 
Affe schaffen falls der technich versierte Händler nicht zur Verfugung 
steht. Einfach vorprogrammiert an den Kunden geben mit 
Anschlussanweisungen, kein Computer und Comportgebastel nötig...

https://www.fischl.de/ispnub/
Gast #6689572
Lesenswert?

Thema COM-port:
Alle angeschlossen usb Geräte scannen à la "lsusb" und die VID/PID auf 
die Werte des Arduinos durchsuchen. Der passende COM Port steht direkt 
dabei. Solange nur ein Arduino angeschlossen ist, ist das failsafe.
Evtl mit einem Testkommando kombinieren - Chip ID des Targets auslesen 
oder so.
#6689751
Lesenswert?

USB Stöpsler schrieb:
> Frank S. schrieb:
>> Null-Click-Bedienung sozusagen.
>
> Dagegen ist dann "Einstöpseln des USB Gerätes zum richtigen
> Zeitpunkt" die High-Tech-Lösung? Boaaaaahhh .....

Nur mal zur Klarstellung:
Das Programm (bzw. die Batch) fordert zum "Einstöpseln" auf. Der 
Benutzer hat dann alle Zeit der Welt das zu tun. In der aktuellen 
Version ist es auch ok, wenn das Gerät noch verbunden war (abstöpseln - 
einstöpseln - los geht's).

Ist vermutlich Low-Tech, macht aber den Charme der Lösung aus.

Frank
#6690236
Lesenswert?

Frank S. schrieb:

>> Dagegen ist dann "Einstöpseln des USB Gerätes zum richtigen
>> Zeitpunkt" die High-Tech-Lösung? Boaaaaahhh .....

> Ist vermutlich Low-Tech, macht aber den Charme der Lösung aus.

Na ja. Deswegen habe ich ihm einen Programmer empfohlen, der sich als 
HID identifiziert. Der wird einfach über die USB VID/PID erkannt, und 
das ist echtes Plug&Play, das ist so wie eine Maus anstecken. Geht 
immer.

fchk
#6710785
Lesenswert?

Chregu schrieb:
> der "Arduino as ISP" jeweils nach dem
> ersten Anstecken beim ersten Kommando einen Fehler ergibt

Auch gelöst nach:
https://www.mikrocontroller.net/articles/AVRDUDE

Konkret:
1
rem Arduino resetten:
2
mode com%NEUERCOMPORT% dtr=on
3
ping -n 1 127.0.0.1 > NUL
4
mode com%NEUERCOMPORT% dtr=off
5
ping -n 3 127.0.0.1 > NUL

ping ist die einzige sinnvolle Möglichkeit unter allen Windowsen ein 
funktionierendes Delay zu machen..

Gruss Chregu

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren