Установка серийного номера на USB-последовательном устройстве CH340

Чтение http://playground.arduino.cc/Linux/Udev по-видимому, существует способ записи в FTDI USB-Serial EEPROM для установки заданного SerialNumber, что позволяет идентифицировать данный nano/другой arduino для обработки его конкретно в UDEV.

У меня есть боад в нано-стиле с USB-последовательным адаптером QinHeng Electronics HL-340, который явно не является чипом FTDI, и поэтому программатор FTDI не работает. Кто-нибудь знает альтернативную утилиту/где я могу найти информацию, чтобы сделать то же самое с этим чипом?

В настоящее время устройство идентифицирует себя с:

[ 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

Что, по сути, бесполезно, так как я не могу идентифицировать прикрепленную плату (когда я прикрепляю две, их детали совпадают).

, 👍10

Обсуждение

возможный дубликат В Linux, как идентифицировать несколько ардуино, подключенных через USB?, @PhillyNJ

К сожалению, на самом деле это не ответ ни на то, ни на другое: на вопрос (поскольку он не отвечает, есть ли способ назначить новый серийный номер, как это можно сделать для чипов FTDI), ни на решение проблемы (поскольку серийный номер udev для всех этих плат, таких как Leonardo, `0`, поэтому udev не может различать несколько плат, подключенных к одному компьютеру., @jvc26

Моя ссылка на мой ответ, в котором говорится о создании правил udev для каждого устройства., @PhillyNJ

Если вы умеете читать по-китайски(я не умею), эта страница может помочь: http://wch.cn/products.php?page=procontent&id=40, @Craig

Да, я это видел, но, к сожалению, страдаю той же лингвистической проблемой!, @jvc26

К сожалению [@Phil Vallone](http://arduino.stackexchange.com/users/490/phil-vallone) проблема в том, что нет уникального серийного номера для идентификации устройства через udev. Для того чтобы обнаружить и идентифицировать уникальное устройство, вам нужно что-то уникальное, чтобы отличить их. Эти устройства имеют один и тот же iSerial, поэтому вы не можете различать их по этому признаку, и они имеют одни и те же идентификаторы продукта и поставщика - так что различия нет ... Спасибо за вашу помощь, к сожалению, это не решает эту проблему!, @jvc26

Вот английская спецификация: http://www.wch-ic.com/downloads/file/79.html, @Jasen


6 ответов


Лучший ответ:

6

На CH340 и семействе UARTS нет хранилища, куда можно было бы поместить уникальный идентификатор. Это также проблема для типа PL2303. Я пытался найти решение этой проблемы. Первый и самый простой-это положение устройства на шине USB. Он будет уникален для каждого устройства. Если вы используете linux, вы можете найти каждое устройство в разделе /dev/serial/by-path . Существует также /dev/serial/by-id, но для этого устройства там будет только одна запись, потому что она показывает последнее подключенное устройство. Каждый из чипов FTDI будет иметь здесь уникальные записи. Дешевые чипы этого не сделают, но у каждого из них есть запись в файле /dev/serial/by-path. Эта позиция и имена устройств должны сохраняться при перезагрузках. Если у вас много изменений в ваших USB-устройствах, подключите все устройства CH340 к одному концентратору, а затем подключите его. Устройства будут перечислены в том порядке, в котором они подключены к концентратору. Этот трюк с одним концентратором должен работать и для macOS, и для Windows, они должны появляться в одном и том же порядке.

Более сложный метод - правила udev. Для устройств с уникальным идентификатором, таких как FTDI, вы можете установить правило udev, которое видит его последовательный порт, а затем создает символическую ссылку на это устройство.

Для устройств с одинаковым серийным номером или без него все гораздо сложнее. Я создал правило udev, которое выглядит следующим образом:

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"

когда устройство соответствует продукту и поставщику дешевого arduino, оно запускает скрипт cheapduino.py' с устройством в качестве аргумента, например

cheapduino.py ttyUSB0

Затем скрипт cheapduino подключается по последовательному каналу к устройству и отправляет строку "ID", а программное обеспечение на устройстве отвечает DEVID=THX1138 или что-то еще. Затем скрипт создает символическую ссылку /dev/THX1138, которая указывает на /dev/ttyUSB0

У этого метода есть много недостатков. Сценарий должен истечь, если программное обеспечение на cheapduino не отвечает. Кроме того, это не использует функцию СИМВОЛИЧЕСКИХ ССЫЛОК udev, поэтому она не будет очищать мертвые ссылки при отключении, но перезапишет их при повторном подключении. Все ваши cheapduinos должны иметь эту функциональность в своем программном обеспечении с различными идентификаторами устройств. Все они должны использовать ту же скорость передачи данных, что и сценарий, если только вы не хотите написать очень сложный сценарий, который занимает много времени. Наконец, этот метод работает гораздо лучше при низкой скорости передачи данных в бодах, чем при высокой скорости передачи данных в бодах, что по временным причинам может не всегда удаваться. (cheapduinos дешевы!) 9600 работает намного лучше, чем 115200, который работает после нескольких попыток. Но поскольку все ваши arduino CH340 должны иметь одинаковую скорость при этом методе, вы можете двигаться только так медленно, как ваше самое быстрое устройство.

Однако этот метод работает, и это то, что я использую, потому что я купил слишком много этих дешевых вещей.

В конце концов, купите оригинальные ардуино или, по крайней мере, с чипами FTDI или что-то еще, что отправляет уникальный идентификатор устройства.

=Богатый

,

2

Если вы хотите различить 2 устройства, которые в основном идентичны, у вас есть 2 способа:

  • всегда подключайте их к одним и тем же портам и используйте дерево USB, чтобы различать их
  • создайте протокол рукопожатия, в котором каждый Arduino использует код, который вы ранее сохранили в соответствующих EEPROM. Возможно, даже можно написать вспомогательную функцию для UDEV, чтобы вспомогательная функция выполняла рукопожатие и сообщала UDEV серийный номер, хранящийся в каждом EEPROM. Это позволило бы написать правило UDEV для ваших устройств.
,

1

Поставьте на свою плату Maxim DS18S20, каждый из которых имеет уникальный com-порт и стоит очень недорого. В Интернете есть много примеров программного обеспечения, использующего это устройство. Вы могли бы намертво привязать его к нано. для работы ему необходим резистор 4,7 К, подключенный к +5, и заземление. Вы можете подключить к заземлению как 5 В, так и заземление устройства. Было бы легко установить эту ошибку на nano, а затем с помощью простой связи через один вывод вы можете получить com-порт. Есть несколько доступных пакетов. С осторожностью вы можете использовать входной контакт, прочитать последовательный порт и сохранить его для дальнейшего использования. Когда он войдет, он сделает это снова. Просто убедитесь, что входные данные не снижаются во время процесса инициализации.

Удачи,

Джил

,

Как только вы решаете проблему не в последовательном USB, а скорее с чем-то, что требует сотрудничества процессора на плате, вы можете просто изменить загрузчик, чтобы он содержал серийный номер, читаемый как там, так и в прикладной программе (т. Е. "скетч")., @Chris Stratton

Что за чушь. DS18S20 - это цифровой термометр!, @Elmue

Да, это термометр; Да, он имеет уникальный серийный номер, который не требует изменения кода или eeprom на каждой плате. Недорого и просто. Недостаток микро должен реагировать. Он будет работать без изменения IDE или любой прошивки и т.д., Однако для этого требуется контакт, который при необходимости можно обойти с помощью mux., @Gil


2

Мне неприятно это говорить, но ответ-нет, нет способа однозначно идентифицировать несколько usb-последовательных конвертеров на основе 340.

У меня такая же проблема, когда у меня есть несколько (4+) usb-последовательных конвертеров, любой из которых может быть подключен к любому порту, и они были приобретены одновременно и поэтому идентичны во всех отношениях (включая iSerial of 0).

В принципе, если я что-то перемещаю, мне приходится подключаться вручную, чтобы увидеть, что подключено, просмотреть вывод dmesg и т. Д. Это большая боль.

том

,

2

CH340B (не G) имеет EEPROM, где вы можете хранить serialnumber.

https://www.mpja.com/download/35227cpdata.pdf

Существует также инструмент Windows для его чтения/записи:

http://www.downxia.com/downinfo/196126.html

Попробую установить и посмотреть, как ведет себя версия G...

,

Можете ли вы сказать мне, где нажать на эту китайскую штуку, чтобы загрузить этот инструмент? Я нашел несколько ссылок на файл RAR, но они истекли., @Elmue


0

Вот программный инструмент, который я написал, который можно использовать для обновления серийного номера головки WinChip CH340B. Это будет полезно для тех, кто хочет подключить несколько устройств виртуального COM-порта CH340B к своему ПК с Windows.

Вы можете получить исходный код этого инструмента из следующего репозитория github.

https://github.com/senthilnathant/tools-ch340b-configuration

,

К сожалению, наиболее часто используемым чипом является CH340G, который, по-видимому, не имеет памяти для серийного номера., @Ryan Pavlik

Да, именно так., @Senthilnathan T

этот исходный код работает с WCH9102?, @Miguel Silva