首页 > 解决方案 > Pyserial 读取具有异常答案的传入信息

问题描述

我正在尝试与 UIRobot UIM 2502 模块进行通信。我可以问一些诸如比特率之类的问题。当我试图获得实际的电机位置时,答案不是正常的十六进制代码。

我可以使用 StepEva 程序来获取当前位置并移动步进器。所以我用 StepEva 移动了步进器,并通过 python 询问了位置。结果作为代码中的注释。

from serial import Serial
ser = Serial(port='COM7', baudrate=38400, timeout=1, bytesize=8, parity='N', stopbits=1)
commando = 'POS;'
ser.write(commando.encode())
response=ser.readline()
print(response)
# responses:
# b'\xcc\x05\xb0\x00\x00\x00\x009\xff'            StepEva position:     57
# b'\xcc\x05\xb0\x00\x00\x00\x01T\xff'            StepEva position:    212
# b'\xcc\x05\xb0\x0f\x7f\x7f<\x13\xff             StepEva position:  -8685 

我不知道如何转换这个十六进制代码。手册说 b0 字节后的 5 个字节描述了位置。来自手册的 POS 响应:CC [Controller ID] B0 [P0] [P1] [P2] [P3] [P4] FF

注释:B0 >> 当前位置的消息 ID [P0] ~ [P4] >> 接收数据 0 ~ 4

标签: pythonserial-portdecodecommunication

解决方案


根据 UIM2502 用户手册的“第 18 页图 5-1:从三个 7 位消息数据到一个 16 位数据的转换”和用户手册 UIM242XX 系列的“第 62 页图12-2:从五个 7 位消息数据到一个 32 位数据的转换” ,每个byte 包含 7 位值,您可以期望以大端形式将其连接成 32 位整数。

您问题的消息未包含在文档中,但根据问题,数字将是 32 位有符号整数。
作为一个 Python 程序,它将如下所示。

def getPosition(response):
    position = 0
    for i in range(3,8):
        position <<= 7
        position += response[i]

    if position > 0x7FFFFFFF:
        position -= 0x100000000

    return position

例如,它可以如下使用。

print(getPosition(b'\xcc\x05\xb0\x00\x00\x00\x009\xff')) # result is 57
print(getPosition(b'\xcc\x05\xb0\x00\x00\x00\x01T\xff')) #           212
print(getPosition(b'\xcc\x05\xb0\x0f\x7f\x7f<\x13\xff')) #           -8685

response=ser.readline()
position=getPosition(response)
print(position)

顺便说一下,我没有看内容,但是当我搜索时,有这样一个包,所以可能有可以通过各种方式使用的功能。
蟒蛇罐


推荐阅读