Micropython 串口收发HEX数据

MicroPython系列

MicroPython串口通讯


前言

MicroPython串口发送接收HEX数据的详细方法


一、串口发送HEX数据

Micropython只能发送bytes数据

from machine import UART

uart=UART(1, baudrate=9600, tx=17, rx=16)	# 实例化

code=[0x01,0x03,0x00,0x10,0x00,0x02,0xC5,0xCE]	# 要发送的数据列表

uart.write(bytes(code))	# 发送该HEX数据

二、串口接收HEX

Micropython接收到的数据均为bytes数据,以下转HEX的方法不适合速度要求较高的场景

import binascii
from machine import UART

uart=UART(1, baudrate=9600, tx=17, rx=16)	# 实例化

def receive():# 接收串口数据的子函数
    if uart.any():
        Len=uart.any()  # 串口缓存区内容长度
        re=[0]*Len  # 创建对应长度的列表
        for i in range(Len):  # 循环读取
            b = '' 
            re[i]=str(binascii.hexlify(uart.read(1)))  #16进制表示方式的bytes数据,转换成字符串
            a=re[i]
            for e in range(0, len(a)):  # 遍历字符串a
                if e > 1 and e < 4:  # 去掉字符串无用的头尾  (b'ff')去掉b'',留下ff  
                    b = b + a[e]  # 当前b='ff'
            re[i]=int(b,16)  # 将16进制表示的字符串,转换成hex数据  当前re[i]=0xFF
        return re  # 返回整个16进制数组成的数组

三、实际案例 读取溶解氧传感器数值

代码如下:

import binascii
import time
from machine import UART

uart=UART(1, baudrate=9600, tx=17, rx=16)

def write():  #  写入循环读取的命令
        code=[0x01,0x10,0x00,0x00,0x00,0x02,0x04,0x00,0x05,0x00,0x1E,0x63,0xA6]
        uart.write(bytes(code))
        True_code=[0x01,0x10,0x00,0x00,0x00,0x02,0x41,0xc8]
        if  receive()== True_code:
            return '写入成功'
        else:
            return '写入失败'
def Water_temperature():  #  写入返回水温的命令,并读取返回值
        code=[0x01,0x03,0x00,0x10,0x00,0x02,0xC5,0xCE]
        uart.write(bytes(code))
        return receive()
def Percentage():  #  写入返回溶解氧百分比的命令,并读取返回值
        code=[0x01,0x03,0x00,0x12,0x00,0x02,0x64,0x0E]
        uart.write(bytes(code))
        return receive()
def Specific():  #  写入返回溶解氧详细数据的命令,并读取返回值
        code=[0x01,0x03,0x00,0x14,0x00,0x02,0x84,0x0F]
        uart.write(bytes(code))
        return receive()
    
def All_read(byte=None):  #  写入返回全部参数的命令,读取返回值并解码
        data=[0,0,0]  # 温度 百分比  mgL
        code=[0x01,0x03,0x00,0x10,0x00,0x08,0x45,0xC9]
        uart.write(bytes(code))
        buf=receive()
        data[0] = ((buf[5] << 8) + buf[6])/100  # 水温
        data[1] = ((buf[7] << 8)+ buf[8])/100  # 溶解氧百分比
        data[2] = ((buf[11] << 8) + buf[12])/100  # 溶解氧mg/L
        if byte == None:
            return data  # 如果不加参数调用,返回全部数据
        else:
            return data[byte]  # 返回对应数据

def receive():#读取返回值
    time.sleep(1)
    if uart.any():
        Len=uart.any()  # 串口缓存区内容字节数
        re=[0]*Len  # 创建对应长度的列表
        for i in range(Len):
            b = '' 
            re[i]=str(binascii.hexlify(uart.read(1)))  # 每次获取一字节  16进制表示方式的bytes数据   并转换成字符串
            a=re[i]  # 当前a= " b'ff' "
            for e in range(0, len(a)):
                if e > 1 and e < 4:  # 去掉字符串无用的头尾  (b'ff')去掉b'',留下ff  
                    b = b + a[e]  # 当前b='ff'
            re[i]=int(b,16)  # 将16进制表示的字符串,转换成hex数据  当前re[i]=0xFF
        return re
    
Data=All_read()
T=str(Data[0])+'℃'
H=str(Data[1])+'%'
Z=str(Data[2])+'mg/L'

print('当前水温:'+T+'  当前溶解氧百分比:'+H+'  溶解氧详细数据:'+Z)
  • 7
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
### 回答1: 要通过Python编程实现串口发送16进制数据,需要使用PySerial模块和binascii模块。 首先,需要安装PySerial模块,可以在终端中使用pip install pyserial命令进行安装。 接着,在Python程序中,可以使用Serial模块中的serial.Serial()函数初始化串口连接。例如: ``` import serial ser = serial.Serial('/dev/ttyUSB0', 9600) # 这里的参数根据实际情况进行修改 ``` 其中,第一个参数是串口的地址,第二个参数是波特率。 接下来,就可以使用binascii模块中的unhexlify()函数将16进制字符串转换为字节数组,并将该字节数组发送到串口中。例如: ``` import binascii data = b'\x00\x01\x02\x03' # 要发送的16进制数据,这里使用字节数组表示 ser.write(data) # 发送数据串口 ``` 其中,b'\x00\x01\x02\x03'表示一个包含4个字节的字节数组,分别是0x00、0x01、0x02和0x03。 最后,记得在使用完串口后,要使用Serial模块中的ser.close()函数关闭串口连接。完整的代码如下: ``` import serial import binascii ser = serial.Serial('/dev/ttyUSB0', 9600) # 初始化串口连接,这里的参数根据实际情况进行修改 data = b'\x00\x01\x02\x03' # 要发送的16进制数据,这里使用字节数组表示 ser.write(data) # 发送数据串口 ser.close() # 关闭串口连接 ``` 这样就可以通过Python程序实现串口发送16进制数据了。 ### 回答2: Python 是一种通用的编程语言,它支持串口通信、网络编程等。作为一种高级编程语言,Python 非常适合用于数据处理、科学计算、机器学习等领域。在 Python 中串口通信是很常见的,有时候我们需要向串口发送 16 进制数据。 Python 中使用 pyserial 库来进行串口通信,这个库提供了向串口发送数据的方法,可以使用这个方法来发送十六进制数据。我们可以先将要发送的数据转换为十六进制,然后再发送给串口。 将数据转换为十六进制可以使用 Python 内置的 hex 函数,该函数将十进制数字转换为十六进制字符串。然后再使用字节编码函数 encode 将十六进制字符串转换为字节串,即可使用 pyserial 库发送数据。 假设我们要发送的数据是 0x12, 0x34,下面的代码演示了如何将其转换为字节串并发送到串口: ```python import serial # 打开串口 ser = serial.Serial('/dev/ttyS0') # 转换数据 data = [0x12, 0x34] hex_data = ''.join(format(x, '02x') for x in data) # 发送数据串口 ser.write(hex_data.encode()) # 关闭串口 ser.close() ``` 在这个例子中,我们把要发送的 16 进制数存储在列表 data 中。然后使用 join 函数将其转换为一个字符串 hex_data。最后,我们使用 encode 函数将字符串转换为一个字节串并写入串口。 总之,Python 提供了很多库来进行串口通信,包括 pyserial、serial、pylint 等。这些库提供了丰富的功能,可以轻松地与串口通信进行交互,包括获取、发送数据等。通过使用这些库,我们可以轻松地将 16 进制数据发送到串口。 ### 回答3: 在Python中通过串口发送16进制数据,可借助于pyserial库中的Serial类。这里介绍一种基于该类的简单实现方法: 1. 首先,需要导入pyserial库以及定义串口通信所需的端口号、波特率等参数: ```python import serial ser = serial.Serial( port='COM3', # 串口号 baudrate=115200, # 波特率 bytesize=serial.EIGHTBITS, # 数据位数 parity=serial.PARITY_NONE, # 奇偶校验 stopbits=serial.STOPBITS_ONE, # 停止位 timeout=None ) ``` 2. 然后,可定义一些16进制数据,如'0xAA', '0x55', '0x01'等: ```python data = bytearray([0xAA, 0x55, 0x01]) # 16进制数据 ``` 3. 最后,使用串口发送函数写入数据即可: ```python ser.write(data) # 向串口发送16进制数据 ``` 完整的Python串口发送16进制数据的示例代码如下: ```python import serial ser = serial.Serial( port='COM3', # 串口号 baudrate=115200, # 波特率 bytesize=serial.EIGHTBITS, # 数据位数 parity=serial.PARITY_NONE, # 奇偶校验 stopbits=serial.STOPBITS_ONE, # 停止位 timeout=None ) data = bytearray([0xAA, 0x55, 0x01]) # 16进制数据 ser.write(data) # 向串口发送16进制数据 ser.close() # 关闭串口 ``` 以上就是Python串口发送16进制数据的简单实现方法。其中,bytearray()函数用于将输入的十六进制数据转换成字节序列,以便后续的写入操作。通过这种方法,可以轻松地在Python中实现串口数据的发送,并且在实际应用中具有很高的灵活性和可扩展性。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值