在Windows10下用MicroPython通过ESP32 UART读取传感器数据的问题
在MicroPython中读取ESP32 GPIO16/GPIO17连接的UART传感器数据
先确认接线与基础配置
首先确保传感器和ESP32的接线正确:
- 传感器TX引脚 → ESP32 GPIO16(作为UART接收端)
- 传感器RX引脚 → ESP32 GPIO17(作为UART发送端)
- 传感器与ESP32的GND引脚必须共地,否则信号会出现乱码或丢失
步骤1:初始化UART端口
MicroPython通过machine.UART模块操作串口,初始化时必须严格匹配传感器的通信参数(波特率、数据位、校验位、停止位,这些参数在传感器手册里都能找到):
from machine import UART # 以UART2为例,参数根据传感器手册调整 uart = UART( 2, baudrate=9600, # 常见波特率:9600/115200,必须和传感器一致 rx=16, tx=17, bits=8, # 多数传感器用8位数据位 parity=None, # 无校验位是主流配置 stop=1, # 1位停止位 timeout=1000 # 读取超时时间(毫秒) )
步骤2:读取并解析传感器数据
传感器的输出格式分为两种,对应不同的解析方式:
场景1:传感器输出ASCII字符串(如"Temp:26.3,Hum:45.1\n")
这种情况直接读取并转成字符串后拆分即可:
while True: if uart.any(): # 检查串口缓冲区是否有数据 raw_data = uart.readline() # 读取一行(直到换行符) if raw_data: # 转成UTF-8字符串并去除首尾空白符 str_data = raw_data.decode('utf-8').strip() print("原始数据:", raw_data) print("解析后字符串:", str_data) # 进一步拆分数据(以温度湿度为例) if "Temp:" in str_data and "Hum:" in str_data: temp_str = str_data.split("Temp:")[1].split(",")[0] hum_str = str_data.split("Hum:")[1] temperature = float(temp_str) humidity = float(hum_str) print(f"温度: {temperature}℃,湿度: {humidity}%")
场景2:传感器输出二进制数据(如固定长度的字节流)
这种情况需要用struct模块将字节转成对应的数据类型:
import struct while True: if uart.any(): # 假设传感器每次输出4字节数据(2字节温度整数+2字节温度小数,大端模式) raw_bytes = uart.read(4) if raw_bytes and len(raw_bytes) == 4: # 用struct解析:'>hh'表示大端模式的两个短整数 int_part, dec_part = struct.unpack('>hh', raw_bytes) temperature = int_part + dec_part / 100 print(f"当前温度: {temperature}℃")
关键注意事项
- 如果传感器需要先发送指令才会返回数据,用
uart.write(b"指令内容\r\n")发送(比如uart.write(b"GET_DATA\r\n")) - 若读取到乱码,优先检查波特率是否匹配,其次检查TX/RX引脚是否接反,最后确认共地是否正常
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

