编写脚本通过OpenOCD Telnet烧录嵌入式设备遇问题求助
OpenOCD 脚本化烧录报错问题解决
问题根源
直接用echo "reset halt; program firmware.elf verify reset;" > /dev/tcp/127.0.0.1/4444的方式会在发送指令后立即关闭连接,而OpenOCD的Telnet服务器需要双向交互——它会先返回欢迎信息,执行指令后也会返回结果,单向写数据后直接断开会导致OpenOCD在发送响应时发现连接已关闭,从而抛出error during read: Connection reset by peer错误。
可行解决方案
方案1:用OpenOCD原生命令行参数直接执行指令(推荐)
不需要依赖Telnet,启动OpenOCD时直接通过-c参数传递指令序列:
openocd -f your_config.cfg -c "reset halt; program firmware.elf verify reset; exit"
这种方式最可靠,避免了Telnet交互的复杂度,OpenOCD启动后会依次执行指令,完成后自动退出。
方案2:用expect处理Telnet交互
编写expect脚本处理连接、等待提示符、发送指令的完整流程:
spawn telnet localhost 4444 expect "OpenOCD>" send "reset halt;\r" expect "OpenOCD>" send "program firmware.elf verify reset;\r" expect "OpenOCD>" send "exit\r"
保存为flash.exp后,执行expect flash.exp即可完成烧录。
方案3:Bash双向重定向处理/dev/tcp
如果一定要用/dev/tcp,需要同时处理读写,避免提前断开连接:
# 打开双向连接 exec 3<>/dev/tcp/127.0.0.1/4444 # 读取OpenOCD的欢迎信息 cat <&3 # 发送第一条指令并读取响应 echo -e "reset halt;\r" >&3 cat <&3 # 发送烧录指令并读取响应 echo -e "program firmware.elf verify reset;\r" >&3 cat <&3 # 退出并关闭连接 echo -e "exit\r" >&3 exec 3>&-
注意:这种方式依赖Bash的/dev/tcp特性,且cat <&3可能会因输出流未结束而阻塞,实际使用时可能需要更精确的响应匹配。
内容的提问来源于stack exchange,提问作者Zak
相关产品推荐
相关产品推荐

