Configurando o número de série no dispositivo serial USB CH340


9

Lendo http://playground.arduino.cc/Linux/Udev , parece haver uma maneira de gravar em uma EEPROM USB-Serial FTDI para definir um determinado SerialNumber, permitindo identificar um determinado nano / outro arduino para lidar especificamente com ele em UDEV.

Eu tenho um carregamento de estilo nano com um adaptador USB-Serial QinHeng Electronics HL-340, que claramente não é um chip FTDI, e o programador FTDI, portanto, não funciona. Alguém sabe de um utilitário alternativo / onde posso encontrar informações para fazer o mesmo com este chip?

Atualmente, o dispositivo se identifica com:

[ 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

O que é essencialmente inútil, pois não consigo identificar o quadro em anexo (quando anexo dois, os detalhes são os mesmos).



11
Infelizmente, isso não é realmente uma resposta para: a pergunta (como não responde se existe uma maneira de atribuir um novo número de série como se pode fazer com os chips FTDI) ou resolver o problema (como o udev serial para todas estas placas, como o Leonardo, é 0, portanto, udev não pode distinguir entre várias placas ligados ao mesmo computador.
jvc26

Meu link é para a minha resposta, que fala sobre a criação de regras do udev para cada dispositivo.
PhillyNJ

11
Se você pode ler chinês (eu não posso) desta página podem ajudar: wch.cn/products.php?page=procontent&id=40
Craig

3
Infelizmente, @Phil Vallone, o problema é que não existe uma série única para identificar o dispositivo via udev. Para detectar e identificar um dispositivo único, você precisa de algo único para diferenciá-los. Esses dispositivos têm o mesmo iSerial; portanto, você não pode diferenciá-los, e eles compartilham os mesmos IDs de produto e fornecedor - para que não haja um diferenciador ... Obrigado pela ajuda, infelizmente, isso não resolve o problema. !
jvc26

Respostas:


3

Não há armazenamento no CH340 e na família de UARTs em que você pode colocar um ID exclusivo. Este também é um problema para o tipo PL2303. Eu tenho tentado encontrar soluções para este problema. Primeiro e mais fácil é a posição do dispositivo no barramento USB. Será exclusivo para cada dispositivo. Se você estiver usando o Linux, poderá encontrar cada dispositivo em / dev / serial / by-path. Também existe um / dev / serial / by-id, mas haverá apenas uma entrada para este dispositivo, pois mostra o último conectado. Os chips FTDI terão entradas únicas aqui. Fichas baratas não, mas cada uma tem uma entrada em / dev / serial / by-path. Esta posição e os nomes dos dispositivos devem persistir durante as reinicializações. Se houver muitas alterações nos seus dispositivos USB, conecte todos os dispositivos CH340 no mesmo hub e conecte-os. Os dispositivos serão enumerados na ordem em que estão conectados ao hub. Esse truque de um hub também deve funcionar para MacOS e Windows; eles devem aparecer na mesma ordem.

Regras mais rígidas do método udev. Para dispositivos com um ID exclusivo, como o FTDI, você pode definir uma regra do udev que veja o número de série e, em seguida, criar um link simbólico para esse dispositivo, é simples.

Para dispositivos com o mesmo ou nenhum número de série, é muito mais complexo. Eu criei uma regra do udev que se parece com isso:

SUBSISTEMA == "tty", ATTRS {produto} == "USB2.0-Serial", EXECUÇÃO + = "/ usr / local / bin / cheapduino.py% k", ATTRS {idVendor} == "1a86", ATTRS { idProduct} == "7523", ENV {ID_MM_DEVICE_IGNORE} = "1"

quando o dispositivo corresponde ao produto e fornecedor do arduino barato, ele executa o script 'cheapduino.py' com o dispositivo como argumento, por exemplo

cheapduino.py ttyUSB0

Em seguida, o script cheapduino se conecta por série ao dispositivo e envia a string 'ID' e o software no dispositivo responde DEVID = THX1138 ou o que for. O script cria um link simbólico / dev / THX1138 que aponta para / dev / ttyUSB0

Existem muitas desvantagens neste método. O script deve expirar se o software no cheapduino não responder. Além disso, isso não está usando a função SYMLINK do udev, para que ele não limpe os links mortos ao desconectar, mas os substituirá ao reconectar. Todos os seus dicionários baratos devem ter essa funcionalidade em seu software, com diferentes IDs de dispositivo definidos. Todos eles devem usar a mesma taxa de transmissão que o script, a menos que você queira escrever um script muito complexo que demore muito. Por fim, esse método funciona muito melhor em baixa taxa de transmissão do que em alta taxa de transmissão, o que, por razões de tempo, pode não ser bem sucedido todas as vezes. 9600 funciona muito melhor que 115200, que funciona após várias tentativas. Mas como todos os seus arduinos CH340 devem ter a mesma velocidade com esse método, você pode ir tão devagar quanto o seu dispositivo mais rápido.

Esse método funciona, porém, e é o que estou usando porque comprei muitas dessas coisas baratas.

No final, compre Arduinos genuínos ou pelo menos outros com chips FTDI ou qualquer outra coisa que envie um ID de dispositivo exclusivo.

= Rico


2

Se o que você quer é separar 2 dispositivos que são basicamente idênticos, você tem 2 maneiras:

  • sempre os conecte nas mesmas portas e use a árvore USB para diferenciá-los
  • crie um protocolo de handshake, em que cada Arduino usa um código que você armazenou anteriormente em suas respectivas EEPROMs. Pode até ser possível escrever uma função auxiliar para o UDEV, para que a função auxiliar faça o handshake e informe ao UDEV o serial que está armazenado em cada EEPROM. Isso permitiria escrever uma regra UDEV para seus dispositivos.


1

Coloque um Maxim DS18S20 em sua placa, cada um com um número de série único e é muito barato. Existem muitos exemplos de software na internet usando este dispositivo. Você pode dar um bug no nano. Para operar, é necessário um resistor de 4,7 K conectado a +5 e uma conexão de aterramento. Você pode conectar as conexões de 5V e de aterramento do dispositivo ao terra. Seria fácil corrigir esse problema com o nano e, com uma simples comunicação através de um pino, você pode obter o número de série. Existem vários pacotes disponíveis. Com cuidado, você pode usar um pino de entrada, ler o serial e salvá-lo para uso futuro. Quando o Inits fará isso novamente. Apenas certifique-se de que a entrada não seja reduzida durante o processo de inicialização.

Boa sorte,

Gil


Uma vez que você não está resolvendo o problema no serial USB, mas com algo que requer a cooperação do processador na placa para descobrir, você também pode simplesmente modificar o gerenciador de inicialização para conter um número de série legível tanto no aplicativo quanto no aplicativo. programa (ie "sketch")
Chris Stratton

Que besteira. O DS18S20 é um termômetro digital!
Elmue 28/02/19

Sim, é um termômetro; Sim, ele possui um número de série exclusivo que não requer alteração do código ou eeprom em cada placa. Barato e simples. Desvantagem que o micro tem que responder. Ele funcionará sem alterar o IDE ou qualquer firmware, etc. no entanto, requer um pino que pode ser contornado com um mux, se necessário.
Gil Gil

1

Eu odeio dizer isso, mas a resposta é não, não há como identificar exclusivamente vários conversores serial USB baseados em 340.

Eu tenho o mesmo problema, onde tenho vários (4+) conversores USB-serial, qualquer um pode ser conectado a qualquer porta e eles foram comprados ao mesmo tempo e, portanto, são idênticos em todos os aspectos (incluindo iSerial de 0).

Basicamente, se eu mudar as coisas, tenho que conectar manualmente para ver o que está anexado, ler a saída dmesg, etc. É uma grande dor.

tom

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.