You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

编写脚本通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 18:27:16