项目需要一个从硬件串口设备读取GPS模块数据并显示,但该硬件设备(HS6602-485)的特点是:需要先向其发送一个指令,随后才能返回一个数据。
串口数据轮询读取
本来打算使用以往的pyserial进行读取,但在write/read存在阻塞情况,不能满足轮询要求,遂使用cushy-serial,地址为:
cushy-serial · PyPIA lightweight serial libraryhttps://pypi.org/project/cushy-serial/使用其中的示例程序完成了串口定时轮询功能的编写。
from cushy_serial import CushySerial
# 示例程序中引入了enable_log,但我不需要在控制台打印debug信息,所以没有引入
serial = CushySerial("COM5", 9600) # 此处改成你的设备串口与波特率
# 此处对应位置的数字改成你要向串口发送的指令
instruction = bytes([0x01, 0x03, 0x00, 0x18, 0x00, 0x06, 0x45, 0xCF])
# 以下代码来自示例程序,https://pypi.org/project/cushy-serial/
# @serial.polling_task(msg=instruction, interval=1, times=5) # 参数分别为指令、间隔、次数
@serial.polling_task(msg=instruction, interval=1)
def handle_rec_msg(rec_msg):
print(f"[serial] msg: {rec_msg}")
十六进制转32位float
将串口数据读出后,串口数据格式为十六进制数,需将其转为32位浮点数才能满足项目需要,遂进行转换方法的查找。
并复习了一个知识:可以以二进制为桥梁进行不同数制的转换
将帖子中代码整合为项目所需代码如下:
import struct
# 十六进制转32位float
# 1 十六进制进制转二进制
hex_num = '42eaae9e'
int_num_16 = int(hex_num, 16)
bin_num = bin(int_num_16)
# 2 二进制转float32
int_num = int(bin_num, 2)
float_num = struct.unpack('f', struct.pack('I', int_num))[0]
print(float_num)
如果需要一步到位的代码,请移步完整版代码资源: