python - 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
解决方案
根据 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)
顺便说一下,我没有看内容,但是当我搜索时,有这样一个包,所以可能有可以通过各种方式使用的功能。
蟒蛇罐
推荐阅读
- ruby-on-rails - 如何根据数组中的响应值对循环进行排序
- android - 简单=赋值和获取实例时的区别?
- javascript - Visual Studio Сode 在绝对路径中看不到波浪号 (~)
- laravel - Eloquent hasMany 不适用于点符号
- spring - Spring Framework 3 中的 Starter 异步类
- android - 使用 android (cordova) 在移动设备上未显示 Web Google pay
- apache-spark - 计划作业在 Zeppelin 中永久运行,停止解释器选项自行消失
- networkx - 使用 ryu 和 networkx 在网络中正确添加主机
- angularjs - 基类中没有模板的角度组件继承
- css - Bootstrap 5 拉伸 div 背景和内容中心