Ustawienie numeru seryjnego na urządzeniu szeregowym CH340 USB

9

Czytając http://playground.arduino.cc/Linux/Udev wydaje się, że istnieje sposób na wypisanie się do EEPROM USB-Serial FTDI w celu ustawienia danego SerialNumber, umożliwiając identyfikację danego nano / innego arduino, aby poradzić sobie z tym konkretnie w UDEV.

Mam ładunek w stylu nano z adapterem USB-szeregowym QinHeng Electronics HL-340, który wyraźnie nie jest układem FTDI, a zatem programator FTDI nie działa. Czy ktoś zna alternatywne narzędzie / gdzie mogę znaleźć informacje, aby zrobić to samo z tym chipem?

Obecnie urządzenie identyfikuje się z:

[ 6850.608080] usb 2-1.2: new full-speed USB device number 7 using ehci-pci
[ 6850.701496] usb 2-1.2: New USB device found, idVendor=1a86, idProduct=7523
[ 6850.701505] usb 2-1.2: New USB device strings: Mfr=0, Product=2, SerialNumber=0
[ 6850.701510] usb 2-1.2: Product: USB2.0-Serial
[ 6850.702201] ch341 2-1.2:1.0: ch341-uart converter detected
[ 6850.704210] usb 2-1.2: ch341-uart converter now attached to ttyUSB0

Co jest w zasadzie bezużyteczne, ponieważ nie mogę zidentyfikować dołączonej planszy (kiedy dołączam dwie, ich szczegóły są takie same).

jvc26
źródło
1
Niestety, tak naprawdę nie jest to odpowiedź na jedno z pytań: pytanie (ponieważ nie odpowiada, czy istnieje sposób przypisania nowego numeru seryjnego, jak można to zrobić w przypadku układów FTDI), lub rozwiązanie problemu (jako seryjny udev dla wszystkich tych płyt, takich jak Leonardo, 0dlatego udev nie może rozróżnić wielu płyt podłączonych do tego samego komputera
jvc26,
Mój link jest do mojej odpowiedzi, która mówi o tworzeniu reguł udev dla każdego urządzenia.
PhillyNJ,
1
Jeśli umiesz czytać po chińsku
Craig
3
Niestety @Phil Vallone problem polega na tym, że nie ma unikalnego numeru seryjnego identyfikującego urządzenie za pomocą udev. Aby wykryć i zidentyfikować unikalne urządzenie, potrzebujesz czegoś unikalnego, aby je odróżnić. Te urządzenia mają ten sam iSerial, więc nie można ich rozróżnić i mają te same identyfikatory produktu i dostawcy - więc nie ma wyróżnika ... Dziękuję za pomoc, niestety nie rozwiązuje tego problemu !
jvc26,

Odpowiedzi:

3

W CH340 i rodzinie UART nie ma miejsca, w którym można by umieścić unikalny identyfikator. Jest to również problem dla typu PL2303. Próbowałem znaleźć rozwiązania tego problemu. Pierwszą i najłatwiejszą jest pozycja urządzenia na magistrali USB. Będzie unikalny dla każdego urządzenia. Jeśli używasz Linuksa, możesz znaleźć każde urządzenie pod / dev / serial / by-path. Istnieje również / dev / serial / by-id, ale będzie tam tylko jeden wpis dla tego urządzenia, ponieważ pokazuje ono ostatnie podłączone. Żetony FTDI będą miały tutaj unikalne wpisy. Tanie chipy tego nie zrobią, ale każdy z nich ma wpis w / dev / serial / by-path. Ta pozycja i nazwy urządzeń powinny pozostać przy ponownym uruchomieniu. Jeśli masz wiele zmian w urządzeniach USB, podłącz wszystkie urządzenia CH340 do tego samego koncentratora, a następnie podłącz je. Urządzenia będą wyliczać w kolejności, w jakiej są podłączone do koncentratora. Ta sztuczka z jednym hubem powinna działać również w systemie MacOS i Windows, powinny one być wyświetlane w tej samej kolejności.

Metoda trudniejsza - zasady udev. W przypadku urządzeń o unikalnym identyfikatorze, takich jak FTDI, możesz ustawić regułę udev, która widzi jej numer seryjny, a następnie tworzy dowiązanie symboliczne do tego urządzenia, jest to proste.

W przypadku urządzeń z tym samym numerem seryjnym lub bez niego jest to znacznie bardziej skomplikowane. Utworzyłem regułę udev, która wygląda następująco:

SUBSYSTEM == "tty", ATTRS {product} == "USB2.0-Serial", RUN + = "/ usr / local / bin / cheapduino.py% k", ATTRS {idVendor} == "1a86", ATTRS { idProduct} == „7523”, ENV {ID_MM_DEVICE_IGNORE} = „1”

gdy urządzenie pasuje do produktu i dostawcy taniego arduino, uruchamia na przykład skrypt „cheapduino.py” z urządzeniem jako argumentem

cheapduino.py ttyUSB0

Następnie skrypt Cheapduino łączy się szeregowo z urządzeniem i wysyła ciąg „ID”, a oprogramowanie urządzenia odpowiada DEVID = THX1138 lub cokolwiek innego. Skrypt następnie tworzy dowiązanie symboliczne / dev / THX1138, które wskazuje na / dev / ttyUSB0

Ta metoda ma wiele wad. Skrypt musi przekroczyć limit czasu, jeśli oprogramowanie na Cheapduino nie odpowiada. Również nie korzysta z funkcji SYMLINK udev, więc nie usunie martwych linków po rozłączeniu, ale nadpisze je przy ponownym połączeniu. Wszystkie Twoje taniegoinos muszą mieć tę funkcjonalność w swoim oprogramowaniu, z ustawionymi różnymi identyfikatorami urządzeń. Wszystkie muszą używać tej samej szybkości transmisji co skrypt, chyba że chcesz napisać bardzo złożony skrypt, który zajmuje dużo czasu. Wreszcie, ta metoda działa znacznie lepiej przy niskiej prędkości transmisji niż przy wysokiej prędkości transmisji, co ze względów czasowych może się nie udać za każdym razem. (tanieduino są tanie!) 9600 działa znacznie lepiej niż 115200, które działa po kilku próbach. Ale ponieważ wszystkie twoje arduinos CH340 muszą mieć tę samą prędkość dzięki tej metodzie, możesz jechać tylko tak wolno, jak najszybsze urządzenie.

Ta metoda DZIAŁA jednak i używam jej, ponieważ kupiłem zbyt wiele z tych tanich rzeczy.

Na koniec kup oryginalne Arduinos lub przynajmniej te z układami FTDI lub coś innego, co wysyła unikalny identyfikator urządzenia.

= Bogaty

Rich Humphrey
źródło
2

Jeśli chcesz rozdzielić 2 urządzenia, które są w zasadzie identyczne, masz 2 sposoby:

  • zawsze podłącz je do tych samych portów i użyj drzewa USB, aby je rozróżnić
  • utwórz protokół uzgadniania, w którym każde Arduino używa kodu, który wcześniej zapisałeś w odpowiednich pamięciach EEPROM. Możliwe jest nawet napisanie funkcji pomocniczej dla UDEV, tak aby funkcja pomocnicza wykonała uścisk dłoni i poinformowała UDEV o numerze seryjnym przechowywanym w każdej pamięci EEPROM. Pozwoliłoby to napisać regułę UDEV dla twoich urządzeń.
Igor Stoppa
źródło
1

Umieść Maxim DS18S20 na swojej płycie, każda ma unikalny numer seryjny i jest bardzo tania. Istnieje wiele przykładów oprogramowania w Internecie za pomocą tego urządzenia. Mógłbyś zarzucić błąd nano. do działania potrzebuje rezystora 4,7 K podłączonego do +5 i uziemienia. Do uziemienia można podłączyć zarówno 5 V, jak i uziemienie urządzenia. Łatwo byłoby zgubić ten błąd do nano, a następnie poprzez prostą komunikację za pomocą jednego pinu można uzyskać numer seryjny. Dostępnych jest kilka pakietów. Ostrożnie możesz użyć wtyku wejściowego, przeczytać numer seryjny i zachować go do wykorzystania w przyszłości. Kiedy rozpocznie się, zrobi to ponownie. Tylko upewnij się, że sygnał wejściowy nie jest obniżany podczas procesu inicjalizacji.

Powodzenia,

Gil

Gil
źródło
Gdy nie rozwiążesz problemu z szeregowym portem USB, ale raczej z czymś, co wymaga współpracy procesora na płycie, możesz równie dobrze zmodyfikować bootloader, aby zawierał numer seryjny odczytywalny zarówno tam, jak i w aplikacji program (tj. „szkic”)
Chris Stratton
Co za nonsens. DS18S20 to cyfrowy termometr!
Elmue
Tak, to termometr; Tak, ma unikalny numer seryjny, który nie wymaga zmiany kodu ani eepromu na każdej płycie. Niedrogi i prosty. Wada mikro musi zareagować. Będzie działał bez zmiany IDE lub jakiegokolwiek oprogramowania układowego itp., Jednak wymaga pinu, który w razie potrzeby można obejść za pomocą multipleksera.
Gil
1

Nienawidzę tego mówić, ale odpowiedź brzmi nie, nie ma sposobu na jednoznaczną identyfikację wielu konwerterów USB-serial na bazie 340.

Mam ten sam problem, ponieważ mam wiele (4+) konwerterów USB-szeregowych, każdy może być podłączony do dowolnego portu i zostały zakupione w tym samym czasie, a zatem są identyczne pod każdym względem (w tym iSerial 0).

Zasadniczo, jeśli przenoszę rzeczy, muszę się połączyć ręcznie, aby zobaczyć, co jest dołączone, przejrzeć wyjście dmesg itp. To duży ból.

Tomek

Tomek
źródło