我需要通过串行端口发送一个小文件(实际上/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
++stty
sx
为了避免阅读有关 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