串口数据
Serial Port data
我正在尝试使用覆盆子上的 pyserial 从带有 USB 接口的绝对编码器读取数据。编码器的数据表如下。 USB接口数据在第22-23页
我已成功连接到编码器,我可以使用
发送命令
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")
表示发起单次持仓请求。我可以使用
打印编码器的输出
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 字节),转换为浮点数,除以 0xFF FF FF,乘以 360。结果是度数。
我不太确定该怎么做。有人可以让我知道我需要写的 python prgramming/functions 才能做到这一点。谢谢。
这是提取字节并将它们转换为整数并缩放为浮点数的方法:
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)
输出:
b'\xea\xd0\x05\x00\x00\x00\xef'
13632768
292.5274832563092
您必须使用内置 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
我正在尝试使用覆盆子上的 pyserial 从带有 USB 接口的绝对编码器读取数据。编码器的数据表如下。 USB接口数据在第22-23页
我已成功连接到编码器,我可以使用
发送命令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")
表示发起单次持仓请求。我可以使用
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 字节),转换为浮点数,除以 0xFF FF FF,乘以 360。结果是度数。
我不太确定该怎么做。有人可以让我知道我需要写的 python prgramming/functions 才能做到这一点。谢谢。
这是提取字节并将它们转换为整数并缩放为浮点数的方法:
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)
输出:
b'\xea\xd0\x05\x00\x00\x00\xef'
13632768
292.5274832563092
您必须使用内置 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