Envie um arquivo pela porta serial com o protocolo XMODEM

2

Eu preciso enviar um pequeno arquivo pela porta serial (na verdade, /dev/ttyUSB0 , há um conversor usb-para-serual conectado à porta). A operação precisa ser programável por script, ou seja, não-interativa.

Veja o que tentei:

  • minicom - funciona corretamente, mas é interativo. A opção --script=SCRIPT parece promissora, mas não tenho ideia de como escrever o script.
  • sx - não interativo, mas congela, provavelmente porque não especifiquei taxa de transmissão e formato de byte (bits de parada, paridade, bits de dados).

Quais são minhas opções?

EDIT1: stty + sx

Ainda sem sorte, enquanto o minicom com 38400 8N1 envia o arquivo corretamente. Estou fazendo

sudo stty -F /dev/ttyUSB0 38400 cs8 -parenb -cstopb -ixoff
sx ~/test_signals/ones.bin -vvvvvvvvvvvv

sx apenas congela. Aqui está a saída:

vorac@laptop:~/projects/megaboot$ sx ~/test_signals/ones.bin -vvvvvvvvvvvv
sx 0.12.21rc

mode:1
Sending /home/vorac/test_signals/ones.bin, 7 blocks: Give your local XMODEM receive command now.
wctx:file length=1000
                     Calling read: alarm=60  Readnum=128 

E apenas fica lá. O receptor está usando o método de soma de verificação curto de 1 byte, indicado pelo envio de um NACK no início do arquivo, em vez do byte de 2 bytes, que seria indicado pelo envio de um 'C'. Talvez isso não seja suportado por cx ?

EDIT2: cu + stty + sx

Para evitar a leitura da documentação exaustiva no cu, copiei o comando de este artigo . Ainda sem sorte.

vorac@laptop:~$ sudo cu -l /dev/ttyUSB0 -s 38400
cu: open (/dev/ttyUSB0): Permission denied
cu: /dev/ttyUSB0: Line in use
vorac@laptop:~$ groups vorac
vorac : vorac adm dialout cdrom sudo dip plugdev lpadmin sambashare wireshark
    
por Vorac 29.10.2015 / 07:55

2 respostas

1

sx não fala sozinho com portas seriais; comunica sobre stdout. Você precisa redirecionar a saída para fazer algo útil.

Pessoalmente, acho mais fácil usar cu para configurar a conexão serial, executar o que for necessário no final remoto para começar a receber dados com * MODEM e usar os códigos de escape de cu para executar sx localmente. Você pode fazer isso com ~$sx (seguido por quaisquer opções que você queira passar para sx ) como a seqüência de escape.

Observe, no entanto, que cu reconhece sequências de escape apenas no início de uma linha.

EDITAR : A mensagem 'line in use' significa que alguma coisa está usando a porta serial. Tente executar fuser /dev/ttyUSB0 para descobrir o que é e eliminá-lo. Alternativamente, você pode puxar o conversor serial USB da porta USB e conectá-lo novamente; Isso certamente matará o que estiver ocupando sua porta serial. Depois disso, sua linha cu deve funcionar.

Se mesmo isso não funcionar, você pode ter um arquivo de bloqueio obsoleto em /var/lock . Isso é bastante improvável, a menos que você tenha usado kill -9 em alguma ferramenta anterior.

    
por 29.10.2015 / 09:50
0

Você não define a taxa de transmissão etc com sx .

Você faz isso com stty . Você provavelmente também deseja desabilitar xon / xoff para xmodem, caso haja algum byte XON ou XOFF no arquivo que você está enviando, então use a opção -ixon .

por exemplo. para 115200, n, 8,1 você usaria:

stty -F /dev/ttyUSB0 115200 cs8 -parenb -cstopb -ixon

Veja man stty para mais detalhes.

    
por 29.10.2015 / 08:03