如何使用 pyserial 和 picocom 打印仅十六进制缓冲区?
How to print hex only buffer with pyserial and picocom?
我正在尝试通过 USB/Serial 端口 [ttyACM*/COM*] 读取协议。当设备 returns 响应时,我应该收到具有以下模式的帧:
| FF | 15 | 44 | 7D | 00 | 88 | 00 | 0D | 00 | 00 | 86 | 00 | 76 | 00 | 00 | 00 | 00 | 40 | 00 | A7 |铁 | (21 个十六进制字节)
我必须使用的配置如下:
- 波特率:2400
- 数据位:8
- 奇偶校验:None
- 停止位:1
- 握手:None
现在,当我尝试使用 Linux 上的 CuteCom 或 Windows 上的 HTerm 阅读此内容时,一切正常,当我将其显示为十六进制时,我得到了我需要的框架。
HTerm:
帧响应:FF 15 44 7C 00 88 00 00 7B 00 7C 00 73 00 1F 00 00 40 00 26 FE(21 个十六进制字节)
CuteCom:
帧响应:ff 15 44 00 00 78 00 00 00 00 01 00 79 00 18 00 00 8d 00 f0 fe(21 个十六进制字节)
现在为什么当我尝试使用 picocom 读取串行时,我无法获得我需要的数据?
Picocom: picocom -b 2400 -r -l --omap crcrlf --imap 8bithex -f n /dev/ttyACM0
帧响应:ff D 82 88 81 82 y@> fe (6 hexbytes?)
框架中间的奇怪字符是怎么回事?
但更重要的是,当我尝试接收 python 中的帧时,我将使用它来解析包,但我也无法获得与 cutecom/hterm 格式相同的帧:
Python [代码]:
ser = serial.Serial("/dev/ttyACM0",2400,timeout=0.3, bytesize=8, parity='N',rtscts=0)
ser.close()
ser.open()
ser.flush()
ser.write(b'\xff\x09\x53\x83\x00\x00\x00\xdf\xfe')
while True:
s = ser.read_until(b'\xfe')
ser.flush()
print(s)
time.sleep(3.0)
Python:
帧响应:b'\xff\x15D\x82\x00\x88\x00\x00\x81\x00\x82\x00y\x00\x1f\x00\x00@\x00>\xfe'(16 个十六进制字节?)
我在框架中间得到了一些不同大小的十六进制数字和奇怪的字符。编辑:(我意识到“奇怪的字符”实际上是基于收到的十六进制代码的 ASCII 字符,我怎样才能将此缓冲区更改为仅十六进制?)
知道为什么 Python 和 Picocom 会发生这种情况吗?使用这些工具时我应该如何阅读框架?
编辑:我尝试使用 ssterm 来使用十六进制从串行读取并且它有效,为什么?我怎样才能使它与 picocom 和 python 使用 pyserial 一起工作?
ssterm:
帧响应:ff 15 44 82 00 88 00 00 81 00 82 00 79 00 1f 00 00 40 00 3e fe(21 个十六进制字节)
原来 python 只是方便地将十六进制字符更改为 ASCII。但该值保持不变,因此框架可以正常使用。虽然 picocom 忽略了空字符。
Picocom 手册页有点混乱。
--imap 8bithex
仅映射到十六进制字符 128-255,并非全部
你应该使用这个:
picocom --imap spchex,tabhex,crhex,lfhex,8bithex,nrmhex
这会将所有可能的字符映射到十六进制转录。
我正在尝试通过 USB/Serial 端口 [ttyACM*/COM*] 读取协议。当设备 returns 响应时,我应该收到具有以下模式的帧:
| FF | 15 | 44 | 7D | 00 | 88 | 00 | 0D | 00 | 00 | 86 | 00 | 76 | 00 | 00 | 00 | 00 | 40 | 00 | A7 |铁 | (21 个十六进制字节)
我必须使用的配置如下:
- 波特率:2400
- 数据位:8
- 奇偶校验:None
- 停止位:1
- 握手:None
现在,当我尝试使用 Linux 上的 CuteCom 或 Windows 上的 HTerm 阅读此内容时,一切正常,当我将其显示为十六进制时,我得到了我需要的框架。
HTerm:
帧响应:FF 15 44 7C 00 88 00 00 7B 00 7C 00 73 00 1F 00 00 40 00 26 FE(21 个十六进制字节)
CuteCom:
帧响应:ff 15 44 00 00 78 00 00 00 00 01 00 79 00 18 00 00 8d 00 f0 fe(21 个十六进制字节)
现在为什么当我尝试使用 picocom 读取串行时,我无法获得我需要的数据?
Picocom: picocom -b 2400 -r -l --omap crcrlf --imap 8bithex -f n /dev/ttyACM0
帧响应:ff D 82 88 81 82 y@> fe (6 hexbytes?)
框架中间的奇怪字符是怎么回事?
但更重要的是,当我尝试接收 python 中的帧时,我将使用它来解析包,但我也无法获得与 cutecom/hterm 格式相同的帧:
Python [代码]:
ser = serial.Serial("/dev/ttyACM0",2400,timeout=0.3, bytesize=8, parity='N',rtscts=0)
ser.close()
ser.open()
ser.flush()
ser.write(b'\xff\x09\x53\x83\x00\x00\x00\xdf\xfe')
while True:
s = ser.read_until(b'\xfe')
ser.flush()
print(s)
time.sleep(3.0)
Python:
帧响应:b'\xff\x15D\x82\x00\x88\x00\x00\x81\x00\x82\x00y\x00\x1f\x00\x00@\x00>\xfe'(16 个十六进制字节?)
我在框架中间得到了一些不同大小的十六进制数字和奇怪的字符。编辑:(我意识到“奇怪的字符”实际上是基于收到的十六进制代码的 ASCII 字符,我怎样才能将此缓冲区更改为仅十六进制?)
知道为什么 Python 和 Picocom 会发生这种情况吗?使用这些工具时我应该如何阅读框架?
编辑:我尝试使用 ssterm 来使用十六进制从串行读取并且它有效,为什么?我怎样才能使它与 picocom 和 python 使用 pyserial 一起工作?
ssterm:
帧响应:ff 15 44 82 00 88 00 00 81 00 82 00 79 00 1f 00 00 40 00 3e fe(21 个十六进制字节)
原来 python 只是方便地将十六进制字符更改为 ASCII。但该值保持不变,因此框架可以正常使用。虽然 picocom 忽略了空字符。
Picocom 手册页有点混乱。
--imap 8bithex
仅映射到十六进制字符 128-255,并非全部
你应该使用这个:
picocom --imap spchex,tabhex,crhex,lfhex,8bithex,nrmhex
这会将所有可能的字符映射到十六进制转录。