python - 串口数据

标签 python raspberry-pi serial-port usb pyserial

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

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

我已成功连接到编码器,我可以使用以下命令发送命令

port = serial.Serial("/dev/serial/by-id/usb-RLS_Merilna_tehnkis_AksIM_encoder_3454353-if00")

port.write(b"x")

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

例如port.write(b"1")是为了发起一个单一的仓位请求。我可以使用

打印编码器的输出
x = port.read()

print(x)

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

b'\xea\xd0\x05\x00\x00\x00\xef'

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

我不太确定该怎么做。有人可以让我知道我需要编写的 python 程序/函数才能执行此操作。谢谢。

最佳答案

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

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)

将打印:

292.5274832563092

关于python - 串口数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47601411/

相关文章:

clojure - 在Raspberry Pi上使用Leiningen缩短Clojure REPL的启动时间

c++ - 通过串行连接的双向 C++ 通信

python - 一种仅针对频繁值的热编码

python - 使用Python中的zip函数对2个相关列表进行排序,如何按降序排序?

python - 我可以在 string.format 方法中使用 for 循环吗?

python - Maya MEL/Python 保存数据

c - 看门狗:设备或资源忙

CMake 无法在树莓派上编译

c - Linux termios 非规范 read() 超时不起作用

linux - 如何设计 nanomsg 套接字和 tty 或 Netlink 的异步处理?