Não é possível se comunicar com periféricos através de USB serial a partir do Linux

0

Estou lutando para estabelecer comunicações com um periférico através da serial USB no meu Linux aqui (fedora 20/64 bits), e provavelmente estou perdendo alguns passos:

Eu conecto o dispositivo, uma porta / dev / ttyUSBx aparece corretamente. Eu uso python / pySerial fazer para dirigi-lo e em vez das respostas que o dispositivo deve me dar, tudo que eu posso ler a partir da porta serial é um byte zero único ("\ x00") cada vez que a conexão é reiniciada.

Eu tentei diferentes adaptadores serial para USB, cabos seriais diferentes e até periféricos (e modelos) diferentes na outra extremidade. Com os programas de código fechado baseados no Windows que se comunicam com o periférico, tudo parece funcionar bem.

Aqui está uma sessão típica do que estou tentando:

>>> import serial
>>> s = serial.Serial("/dev/ttyUSB0", timeout=.1)
>>> 
>>> s.flush()
>>> s.write("(&S)")
4
>>> s.read()
'\x00'
>>> 

(em vez de "\ x00" aqui, eu deveria ter uma string de comprimento de caracteres como uma resposta. (o dispositivo responde corretamente ao mesmo protocolo sobre TCP / IP).

Estou faltando alguma etapa de configuração na porta serial? Aqui está minha saída setserial:

/dev/ttyUSB0, UART: unknown, Port: 0x0000, IRQ: 0, Flags: low_latency

E a configuração do Pyserial:

Serial<id=0x7f525c5daf10, open=True>(port='/dev/ttyUSB0', baudrate=9600, bytesize=8, parity='N', stopbits=1, timeout=0.1, xonxoff=False, rtscts=False, dsrdtr=False)

(esses parâmetros são os mesmos que são mostrados na porta serial que está configurada no Windows onde o dispositivo funciona - mas para o tempo limite)

    
por jsbueno 15.12.2014 / 16:20

1 resposta

1

Corrigido Eu tive que verificar com o fornecedor do dispositivo - e é uma questão das configurações do dispositivo no protocolo - É preciso usar a porta serial com o DTR ativo e o RTS inativo - essas podem ser tentativas óbvias de uma usada com o lado do hardware, mas não para os desenvolvedores habituados a codificação de nível superior.

O fato que me enganou é que, com pouca documentação sobre o que é, eu confundi os parâmetros rtsdtr e rtscts no objeto PySerial Serial do Python com a configuração real de pinos DTR e RTS - e mudar esses dois não conseguiu nada .

Chamando os métodos

serial_.setDTR(True)
serial_.setRTS(False)  

é o que realmente define os pinos na porta e possibilita a comunicação com este dispositivo.

    
por 18.12.2014 / 18:11