使用 XMODEM 协议通过串口发送文件

使用 XMODEM 协议通过串口发送文件

我需要通过串行端口发送一个小文件(实际上/dev/ttyUSB0,该端口连接有一个 USB 到串行转换器)。该操作需要可编写脚本,即非交互式。

这是我尝试过的:

  • minicom- 工作正常,但具有交互性。--script=SCRIPT选项看起来很有希望,但我不知道如何编写脚本。
  • sx- 非交互式,但冻结,可能是因为我没有指定波特率和字节格式(停止位、奇偶校验、数据位)。

我有什么选择?


编辑1:stty+sx

仍然没有运气,而 minicom38400 8N1正确发送了文件。我在做

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

sx只是冻结了。这是输出:

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 

并且就呆在那里。接收方使用短 1 字节校验和方法(通过在文件开头发送 NACK 来指示),而不是 2 字节 crc(通过发送“C”来指示)。也许这是不支持的cx


编辑2 :cu++sttysx

为了避免阅读有关 cu 的详尽文档,我从以下位置复制了命令本文。还是没有运气。

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

答案1

xmodem 转换在此处进行。输入/输出重定向后(示例参考)正如 Wouter Verhelst 建议的那样,根据您的经验添加。幸运的是,我在 Linux 上发送了一个带有 2 个命令的 bin 固件。

$ sudo stty -F /dev/ttyUSB1 9600 cs8 -parenb -cstopb -ixoff
$ sudo stty -F /dev/ttyUSB1
speed 9600 baud; line = 0;
-brkint -imaxbel

$ sx fw.bin < /dev/ttyUSB1 > /dev/ttyUSB1

答案2

sx本身不与串行端口通信;它通过标准输出进行通信。您需要重定向输出才能执行任何有用的操作。

就我个人而言,我发现最简单的方法是cu设置串行连接,运行远程端所需的任何内容以开始使用 *MODEM 接收数据,然后使用 的cu转义码sx在本地运行。您可以使用~$sx(后跟您想要传递给的任何选项sx)作为转义序列来执行此操作。

但请注意,它cu仅识别行开头的转义序列。

编辑:“线路正在使用”消息表示其他设备正在使用串行端口。试着跑去fuser /dev/ttyUSB0找出它是什么,然后杀死它。或者,您可以将 USB 串口转换器从 USB 端口拔出并重新插入;这肯定会杀死任何占用你串行端口的东西。之后,您的cu线路应该可以正常工作。

如果这还不起作用,那么你可能有一个过时的锁文件/var/lock。不过,这种情况不太可能发生,除非你使用过kill -9以前的工具。

答案3

您没有设置波特率等sx

你用 来做到这一点stty。您可能还想禁用 xmodem 的 xon/xoff,以防万一您发送的文件中存在任何 XON 或 XOFF 字节,因此请使用该-ixon选项。

例如,对于 115200,n,8,1 您将使用:

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

请参阅man stty了解更多详情。

答案4

你不能做类似的事情吗

$ picocom -b 115000 /dev/ttyUSB0 
// 2nd term
$ cat file > /dev/ttyUSB0

相关内容