如何使用pyserial和picocom打印仅十六进制的缓冲区?

问题描述

我正在尝试通过USB /串行端口[ttyACM * / COM *]读取协议。当设备返回响应时,我应该收到具有以下模式的帧:

| FF | 15 | 44 | 7D | 00 | 88 | 00 | 0D | 00 | 00 | 86 | 00 | 76 | 00 | 00 | 00 | 00 | 40 | 00 | A7 | FE | (21十六字节)

我必须使用的配置如下:

  • 波特率:2400
  • 数据位:8
  • 奇偶校验:无
  • 停止位:1
  • 握手:无

现在,当我尝试在Linux上使用CuteCom或在Windows上使用HTerm读取此文件时,一切正常,当我将其显示为十六进制时,我得到的帧正是我需要的。

HTerm:

On HTerm/Windows i get the frames

帧响应:FF 15 44 7C 00 88 00 00 7B 00 7C 00 73 00 1F 00 00 40 00 26 FE(21 hexbytes)

CuteCom:

On CuteCom/Linux i also get the frames

帧响应: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

Can't get the frame on picocom

帧响应:ff D 82 88 81 82 y @> fe(6字节)

那帧中间的奇怪字符怎么了?

但是更重要的是,当我尝试使用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:

Can't get the frame on python either

帧响应:b'\ xff \ x15D \ x82 \ x00 \ x88 \ x00 \ x00 \ x81 \ x00 \ x82 \ x00y \ x00 \ x1f \ x00 \ x00 @ \ x00> \ xfe'(16 hexbytes?)

在这里,我在框架的中间得到了一些不同大小的十六进制数字和奇怪的字符。编辑:(我意识到“奇怪的字符”实际上是基于收到的十六进制代码的ASCII字符,我如何才能将此缓冲区更改为仅十六进制?)

您知道为什么Python和Picocom会发生这种情况吗?使用这些工具时我应该如何阅读框架?

编辑:我尝试使用ssterm使用十六进制从序列中读取数据,并且有效,为什么?如何使用pyserial将其与picocom和python配合使用?

ssterm:

communication works with ssterm

帧响应:ff 15 44 82 00 88 00 00 81 00 82 00 79 00 1f 00 00 40 00 3e fe(21 hexbytes)

解决方法

结果是python只是方便地将十六进制字符更改为ASCII。但是该值保持不变,因此该帧可以正常使用。当picocom忽略空字符时。