Pyserial读取带有异常ans的传入信息

2024-05-29 02:43:16 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试与UIM 2502模块的UIRobot通信。我可以问一些像比特率之类的问题。当我试图得到实际的电机位置,答案不是一个正常的十六进制代码。你知道吗

我可以使用程序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


Tags: 代码posresponseserialposition手册sercommando
1条回答
网友
1楼 · 发布于 2024-05-29 02:43:16

根据User Manual UIM2502的“第18页图5-1:从3个7位消息数据到16位数据的转换”和User Manual UIM242XX Series的“第62页图12-2:从5个7位消息数据到32位数据的转换”,每个字节包含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)

顺便说一句,我还没有查看内容,但是当我搜索时,有这样一个包,因此可能有可以以各种方式使用的功能。
python-can

相关问题 更多 >

    热门问题