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

编写驱动拼接十六进制指令,打印时Python自动清屏问题求助

解决控制台被清空的问题

你遇到的问题根源在于你打印的msg字符串里包含了终端控制字符,这些字符被控制台解析成了清屏/重置终端的指令,所以一执行print(msg)就自动清空了屏幕。

具体来看你的msg内容:

msg = '\xc2%s%s' % ('\x1b\x63', '07')

展开后得到的字符串是\xc2\x1b\x6307,其中\x1b是ASCII里的ESC(转义)字符,而ESC + 'c'(也就是\x1b\x63)是VT100终端标准里的全重置指令(RIS),这个指令会直接清空控制台并重置终端的所有状态,所以你看不到打印内容,反而屏幕被清空了。

解决办法:打印字符的转义/十六进制表示,避免触发终端控制

要排查指令问题,你需要看到msg的真实内容,而不是让终端解析控制字符。这里有两种简单的方法:

1. 使用repr()打印转义后的字符串

repr()会把字符串里的不可见字符、控制字符转换成可读的转义序列,这样你就能清楚看到每个字符的真实值:

msg = '\xc2%s%s' % ('\x1b\x63', '07')
assert self.dev.ctrl_transfer(0x21, 9, 0x0300, 0, msg) == len(msg)
print(repr(msg))  # 输出会是 '\xc2\x1b\x6307'

2. 打印十六进制字节表示(更适合驱动指令排查)

因为你是在处理USB驱动的十六进制指令,直接看字节的十六进制编码会更直观。USB的ctrl_transfer通常接受字节数据,推荐你改成字节串来拼接指令,避免字符串编码带来的意外问题:

# 改成字节串(更符合USB传输的字节数据特性)
msg = b'\xc2%s%s' % (b'\x1b\x63', b'07')
assert self.dev.ctrl_transfer(0x21, 9, 0x0300, 0, msg) == len(msg)
print(msg.hex())  # 输出会是 'c21b633037'

如果必须使用字符串,也可以先转成字节再打印十六进制:

print(msg.encode('utf-8').hex())

额外提示:检查指令拼接的正确性

从你的指令来看,用字符串拼接字节指令可能存在编码风险(比如UTF-8会对某些字节做转换)。建议全程使用字节串(b'')来处理USB指令,这样能保证拼接出来的十六进制序列完全符合你的预期。

内容的提问来源于stack exchange,提问作者shplaz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:28:13