Отправка файла через последовательный порт с использованием ожидаемого и 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"