在CH340 USB串行设备上设置序列号


9

阅读http://playground.arduino.cc/Linux/Udev,似乎有一种方法可以写出FTDI USB串行EEPROM来设置给定的SerialNumber,从而使您可以识别给定的nano /其他arduino来专门处理它在UDEV中。

我有一个带有QinHeng Electronics HL-340 USB串行适配器的纳米级插件,它显然不是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

这基本上没有用,因为我无法确定所连接的给定板(当我附加两个时,它们的详细信息是相同的)。



1
不幸的是,这并不是一个答案:问题(因为它无法回答是否有一种方法可以分配新的序列号,就像对FTDI芯片一样)或解决问题(如udev序列号)因为所有这些板,例如Leonardo,都是0,因此udev不能区分连接到同一台计算机的多个板
jvc26 2014年

我的链接是我的答案,它涉及为每个设备创建udev规则。
PhillyNJ 2014年

1
如果您会读中文(我不会),则此页面可能会有所帮助:wch.cn/products.php?
Craig

3
不幸的是,@ Phil Vallone的问题是没有唯一的序列可通过udev识别设备。为了检测和识别独特的设备,您需要独特的东西来区分它们。这些设备具有相同的iSerial,因此您无法对其进行区分,并且它们共享相同的产品和供应商ID-因此没有任何区别...谢谢您的帮助,很遗憾,它无法解决此问题!
jvc26 2014年

Answers:


3

CH340和UART系列上没有存储可放置唯一ID的存储区。这也是PL2303型的问题。我一直在寻找解决此问题的方法。首先,最简单的是设备在USB总线上的位置。对于每个设备,它都是唯一的。如果您使用的是Linux,则可以在/ dev / serial / by-path下找到每个设备。还有一个/ dev / serial / by-id,但是此设备在那里只有一个条目,因为它显示了最后一个已连接的条目。FTDI芯片将在此处分别具有唯一的条目。便宜的芯片不会,但是它们每个都在/ dev / serial / by-path下有一个条目。此位置和设备名称应在重新启动后保持不变。如果USB设备有很多更改,请将所有CH340设备插入同一集线器,然后再插入。设备将按插入集线器的顺序枚举。这种一站式技巧也适用于MacOS和Windows,它们应该以相同的顺序出现。

更难的方法-udev规则。对于具有唯一ID的设备(例如FTDI),您可以设置udev规则以查看其序列号,然后创建到该设备的符号链接,这很简单。

对于序列号相同或没有的设备,它要复杂得多。我创建了一个udev规则,如下所示:

SUBSYSTEM ==“ tty”,ATTRS {产品} ==“ USB2.0-串行”,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 / ttyUSB0的符号链接/ dev / THX1138

这种方法有很多缺点。如果cheapduino上的软件没有响应,则脚本必须超时。同样,这没有使用udev的SYMLINK函数,因此它不会在断开连接时清除死链接,但在重新连接时会覆盖它们。您的所有cheapduinos必须在其软件中具有此功能,并且设置了不同的设备ID。它们都必须使用与脚本相同的波特率,除非您想编写一个非常复杂的脚本,并且需要很长时间。最后,此方法在低波特率下比在高波特率下效果更好,由于时序原因,这种方法可能不会每次都成功。(cheapduinos很便宜!)9600的性能比115200更好,后者在多次尝试后仍能工作。但是,由于使用此方法,所有CH340 arduino必须保持相同的速度,因此只能与最快的设备一样慢。

但是这种方法确实有效,这是我使用的方法,因为我以太多的方式购买了这些便宜的东西。

最后,购买正版Arduino,或者至少购买带有FTDI芯片或其他能够发送唯一设备ID的器件。

=丰富


2

如果要区分两个基本相同的设备,则有两种方法:

  • 始终将它们插入相同的端口,并使用USB树区分它们
  • 创建一个握手协议,其中每个Arduino使用您先前存储在各自EEPROM中的代码。甚至有可能为UDEV编写一个辅助函数,以便该辅助函数进行握手并告知UDEV存储在每个EEPROM中的序列。这样就可以为您的设备编写一个UDEV规则。


1

将Maxim DS18S20放在您的电路板上,每个都有唯一的序列号,而且价格便宜。使用此设备的互联网上有很多软件示例。您可以将其调试到nano。要运行它,需要一个连接到+5的4.7K电阻和一个接地连接。您可以将设备的5V和接地连接都接地。很容易将其错误地存入nano,然后通过一个引脚进行简单的通信即可获得序列号。有几种可用的软件包。您可以小心使用输入引脚,读取序列并将其保存以备将来使用。当它启动时,它将再次执行此操作。只要确保在初始化过程中输入没有被拉低即可。

祝好运,

吉尔


一旦您没有解决USB串行中的问题,而是要解决需要板上板上的处理器配合才能发现的问题,您不妨修改引导加载程序,使其包含可在其中和应用程序中读取的序列号程序(即“素描”)
克里斯·斯特拉顿

废话 DS18S20是数字温度计!
Elmue

是的,它是温度计;是的,它具有唯一的序列号,不需要更改每个板上的代码或eeprom。便宜又简单。缺点是微必须响应。它可以在不更改IDE或任何固件等的情况下工作,但是需要一个可以与多路复用器配合使用的引脚(如果需要)。
吉尔

1

我讨厌这样说,但是答案是否定的,没有办法唯一地识别多个基于340的USB串行转换器。

我有一个同样的问题,我有多个(4+)USB串行转换器,任何一个都可以插入任何端口,并且它们是同时购买的,因此在各个方面都是相同的(包括0的iSerial)。

基本上,如果我四处移动,我必须手动连接以查看连接的内容,仔细阅读dmesg输出等。这是一个很大的痛苦。

汤姆

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.