首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >串口数据

串口数据
EN

Stack Overflow用户
提问于 2017-12-01 21:00:01
回答 2查看 610关注 0票数 2

我正在尝试使用Raspberry上的pyserial从带有USB接口的绝对编码器读取数据。编码器的数据表如下。USB接口数据在第22-23页。

https://www.rls.si/eng/fileuploader/download/download/?d=0&file=custom%2Fupload%2FData-sheet-AksIM-offaxis-rotary-absolute-encoder.pdf

我已经成功地连接到编码器,我能够发送命令

代码语言:javascript
复制
port = serial.Serial("/dev/serial/by-id/usb-RLS_Merilna_tehnkis_AksIM_encoder_3454353-if00")

port.write(b"x")

其中x是为USB接口列出的任何可用命令。

例如,port.write(b"1")意味着启动一个位置请求。我能够输出来自编码器的输出

代码语言:javascript
复制
x = port.read()

print(x)

问题是将输出转换为实际的位置数据。port.write(b"1")输出以下数据:

代码语言:javascript
复制
b'\xea\xd0\x05\x00\x00\x00\xef'

我知道第一个和最后一个字节只是页眉和页脚。字节5和6是编码器状态。字节2-4是实际的位置数据.客户支持部门告诉我,我需要取字节2到4,将它们转换为32位无符号整数(低3个字节),转换为浮点数,除以0xFF FF,乘以360。结果是度。

我不太确定该怎么做。有人能让我知道我需要编写的python prgramming/函数才能做到这一点吗?谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-12-01 21:29:05

您必须使用内置的from_bytes()方法:

代码语言:javascript
复制
x = b'\xea\xd0\x05\x00\x00\x00\xef'

number = 360 * float(
    int.from_bytes(x[1:4], 'big')  # get integer from bytes
) / 0xffffff

print(number)

将印刷:

代码语言:javascript
复制
292.5274832563092
票数 1
EN

Stack Overflow用户

发布于 2017-12-01 21:19:32

这是提取字节并将它们作为浮点数转换为整数和缩放的方法:

代码语言:javascript
复制
x = b'\xea\xd0\x05\x00\x00\x00\xef'

print(x)

int_value = 0   # initialise shift register
for index in range(1,4):
    int_value *= 256          # shift up by 8 bits
    int_value += x[index]     # or in the next byte
print(int_value)

# scale the integer against the max value
float_value = 360 * float(int_value) / 0xffffff
print(float_value)

输出:

代码语言:javascript
复制
b'\xea\xd0\x05\x00\x00\x00\xef'
13632768
292.5274832563092
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47601411

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档