Отправка файла через последовательный порт с использованием ожидаемого и ymodem на Linux?

Цикл командной строки ATF (arm trust firmware, BL1, BL2) поддерживает протокол ymodem. В Windows я использую TeraTerm и могу использовать его меню для ручной отправки файлов на устройство по протоколу ymodem после ввода команды. ymodem <address> и видя C персонаж:

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 для автоматизации процесса, который отлично работает. Теперь я хочу использовать screen+expect+sz под Linux делать то же самое... Но пока я не успешен.

В настоящее время я тестирую со следующим кодом:

 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 Bytes, Как expect смотреть это сообщение сейчас? Я понимаю, что эти два порожденных процесса (screen а также sz) разговаривает напрямую, в обход expectнет?

1 ответ

Вы не должны делать секунду spawn бежать sz, Вы запустили screen использовать устройство tty, так что теперь вы должны попросить его запустить sz для вас, подключив любой вывод из этой команды к tty и передав любой вывод из tty в качестве ввода обратно в эту команду. Вы делаете это, отправив exec командовать screen процесс, сопровождаемый sz Команда для выполнения. Вам также нужно добавить 2 индикатора !! подключить стандартный ввод и стандартный вывод команды к tty. И вам нужно отправить обычный контроль-а : префикс и двоеточие, чтобы экран воспринимал ваш ввод как команду.

Так замените spawn sz --ymodem $bl2_burn_path линия чем-то вроде

send "\001:exec !! spawn sz --ymodem $bl2_burn_path\r"
Другие вопросы по тегам