编写驱动拼接十六进制指令,打印时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
相关产品推荐
相关产品推荐

