在Linux上使用Expect和ymodem通过串行端口发送文件?

时间:2018-09-14 01:35:29

标签: expect zmodem

ATF(ARM受信任固件,BL1,BL2)命令行循环支持ymodem协议。在Windows下,我正在使用TeraTerm,并且在输入命令ymodem <address>并看到C字符后,可以使用ymodem协议使用其菜单将文件手动发送到设备:

NOTICE:  Booting Trusted Firmware
NOTICE:  BL1: v1.4(release):58e7395
NOTICE:  BL1: Built : 17:39:25, Jan  2 2018
# ymodem 0x45103000
NOTICE:  ## Ready for binary (ymodem) download to 0x451030000 at 115200 bps...
C

Tera Term还支持Macro自动执行该过程,效果很好。现在,我想在Linux下使用screen + expect + sz做同样的事情……但是到目前为止,我还没有成功。

我目前正在使用以下代码进行测试:

 85 spawn screen /dev/ttyUSB0 115200
 86 set screen $spawn_id
 93 send "ymodem 0x45103000\r"
 94 set timeout 3
 95 expect {
 96         timeout {
 97                 puts "timeout..."
 98                 exit 1
 99         }
100         "115200 bps...\r\nC"
101 }
102 #stty -echo raw
103 spawn sz --ymodem $bl2_burn_path
104 interact -u $screen
105 expect "Bytes"    # can expect see this? 
106 stty echo -raw
107
108 send "\r\r\r"
109 send "exit\r"

似乎sz重复发送了文件,但是远程端没有反馈:

expect: does "ymodem 0x45103000\r\n\u001b)0\u001b[?1049h\u001b[4l\u001b[?1h\u001b=\u001b[0m\u001b(B\u001b[1;24r\u001b[H\u001b[J\u001b[H\u001b[Jymodem 0x45103000\r\nNOTICE:  ## Ready for binary (ymodem) download to 0x45103000 at 115200 bps...\r\nC" (spawn_id exp7) match glob pattern "115200 bps...\r\nC"? yes
expect: set expect_out(0,string) "115200 bps...\r\nC"
expect: set expect_out(spawn_id) "exp7"
expect: set expect_out(buffer) "ymodem 0x45103000\r\n\u001b)0\u001b[?1049h\u001b[4l\u001b[?1h\u001b=\u001b[0m\u001b(B\u001b[1;24r\u001b[H\u001b[J\u001b[H\u001b[Jymodem 0x45103000\r\nNOTICE:  ## Ready for binary (ymodem) download to 0x45103000 at 115200 bps...\r\nC"
spawn sz --ymodem /home/bruin/work/f5/bsp/bl2-burn.bin
parent: waiting for sync byte
parent: telling child to go ahead
parent: now unsynchronized from child
spawn: returns {31117}
spawn id exp7 sent <C>
spawn id exp8 sent <\u0001\u0000\u00ffbl2-burn.bin\u000045352 13335245531 100700 0 1 45352\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0001c\u0013\u00a4>

spawn id exp8 sent <\u0001\u0000\u00ffbl2-burn.bin\u000045352 13335245531 100700 0 1 45352\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0001c\u0013\u00a4>

上面的脚本缺少什么?

我还有另一个问题,关于如何确定文件传输已完成。正常情况下(据我观察,在Windows上),一旦文件传输完成,ATF就会打印传输数据的大小,例如45123 Bytesexpect现在如何观看此味精?我的理解是,这两个产生的进程(screensz)直接交谈,绕过expect,不是吗?

1 个答案:

答案 0 :(得分:0)

您不应再运行spawn来运行sz。您已经启动了screen来使用tty设备,所以现在您必须要求它为您运行sz,将该命令的任何输出连接到tty,并将tty的任何输出作为输入传递回去。该命令。为此,您可以向exec进程发送screen命令,然后执行sz命令。您还需要添加2个指示符!!,以将命令的stdin和stdout连接到tty。然后,您需要发送通常的 control-a :前缀和冒号,以使屏幕将您的输入作为命令。

因此,将spawn sz --ymodem $bl2_burn_path行替换为

send "\001:exec !! spawn sz --ymodem $bl2_burn_path\r"