ESP32-S3 MicroPython串口通信实战从参数配置到UART1/2数据收发最近在玩ESP32-S3开发板发现很多朋友在MicroPython环境下搞不定串口通信。要么是引脚配置不对要么是收不到数据要么就是和下载调试用的串口冲突了。今天我就结合自己的踩坑经验手把手带你搞定ESP32-S3的串口通信从参数配置到实际收发数据让你一次弄明白。1. 串口通信基础先搞懂这些关键参数在动手写代码之前咱们得先搞清楚串口通信的几个关键参数。你可以把串口想象成两个人打电话这些参数就是约定好的通话规则两边必须一致才能正常沟通。1.1 核心参数详解波特率Baud Rate这是通信的速度单位是bps比特每秒。常见的波特率有9600、115200等。注意通信双方比如你的ESP32和电脑必须设置相同的波特率否则收到的就是乱码。ESP32-S3支持很宽的波特率范围从110到5000000 bps但最常用的是115200。数据位Data Bits每个数据包可以理解为一个字符包含多少位数据。通常是8位因为一个ASCII字符就是8位。当然也可以是5、6、7位但8位最常用。停止位Stop Bits用来表示一个数据包传输结束的标志。通常是1位也可以是1.5位或2位。停止位越多不同设备时钟同步的容忍度越高但传输速度会变慢。一般用1位就够了。校验位Parity Bits简单的错误检查机制。比如奇校验就是确保数据位中“1”的个数是奇数。如果接收方发现不符合就知道数据可能出错了。这个参数也可以设置为“无校验”很多简单通信场景下不用。提示对于ESP32-S3和电脑通过CH340模块通信这种常见场景最常用的参数组合是波特率115200、数据位8、停止位1、无校验。记住这个组合能解决90%的问题。1.2 串口的工作模式串口通信有三种工作模式理解这个有助于你设计通信逻辑单工模式数据只能单向传输就像广播只能听不能说。半双工模式可以双向传输但不能同时进行。就像对讲机说的时候不能听听的时候不能说。全双工模式可以同时双向传输。就像打电话可以边说边听。ESP32-S3的UART支持全双工模式这也是最常用的模式。2. ESP32-S3的串口资源与硬件连接2.1 三个串口但有一个不能用ESP32-S3内部有三个硬件串口UART0、UART1、UART2。但这里有个大坑要注意UART0已经被开发板的自动下载和调试功能占用了这意味着如果你用UART0去连接其他设备通信很可能会和下载程序的功能冲突导致各种奇怪的问题。所以在实际项目中强烈建议只用UART1和UART2。好消息是UART1和UART2的引脚可以灵活配置几乎可以用任何GPIO引脚作为TX发送和RX接收脚。2.2 硬件连接用CH340模块连接电脑要和电脑通信你需要一个USB转串口模块。最常用的就是CH340模块价格便宜用起来也简单。连接步骤准备CH340模块确保你有一个CH340模块常见的是CH340G或CH340E型号。安装驱动Windows系统通常插上USB后会自动安装驱动。如果没识别需要手动安装。Mac/Linux系统需要下载并安装对应的驱动。驱动可以在开发板的资料包中找到路径通常是资料下载中心→【入门手册资料】百度网盘资料→第05章 开发工具→CH340驱动.zip。硬件连线CH340模块的TX引脚 → ESP32-S3的RX引脚比如GPIO9CH340模块的RX引脚 → ESP32-S3的TX引脚比如GPIO10CH340模块的GND引脚 → ESP32-S3的GND引脚必须接CH340模块的VCC引脚 → 如果需要给模块供电可以接3.3V或5V看模块支持注意串口通信中TX发送端要接对方的RX接收端RX要接对方的TX千万别接反了GND一定要共地否则通信不稳定。连接好后把CH340模块插到电脑USB口在设备管理器中应该能看到一个新的COM口Windows或ttyUSB设备Linux/Mac。3. MicroPython串口编程实战理论说完了咱们直接上代码。我会从最简单的例子开始逐步深入。3.1 基础配置初始化串口在MicroPython中串口操作主要通过machine.UART类来实现。先看一个最基础的初始化例子from machine import UART import time # 初始化UART1波特率115200TX用GPIO10RX用GPIO9 uart1 UART(1, baudrate115200, tx10, rx9) print(UART1初始化完成)代码解释from machine import UART导入UART模块UART(1, ...)第一个参数是串口号1表示UART12表示UART2baudrate115200设置波特率为115200tx10, rx9指定TX引脚为GPIO10RX引脚为GPIO9引脚选择技巧 ESP32-S3的大部分GPIO都可以用作UART引脚但要注意避开一些特殊功能的引脚。我一般喜欢用这些UART1TX17, RX18 或者 TX10, RX9UART2TX8, RX7 或者 TX5, RX63.2 发送数据把数据“说”出去发送数据超级简单用write()方法就行# 发送字符串 uart1.write(Hello ESP32-S3!\r\n) # 发送字节数据 data_to_send b\x01\x02\x03\x04 # 字节数组 uart1.write(data_to_send) # 发送数字需要先转成字符串或字节 number 12345 uart1.write(str(number)) # 发送字符串12345 uart1.write(number.to_bytes(2, big)) # 发送2字节的二进制数据注意write()方法发送的是字节数据。如果你发送字符串MicroPython会自动转换成字节。但发送数字时需要手动转换。\r\n是回车换行在串口调试助手中显示为换行。3.3 接收数据听听对方“说”什么接收数据有几种方式根据你的需求选择方法1读取指定长度的数据# 尝试读取10个字节 data uart1.read(10) if data: print(收到数据:, data)方法2读取所有可用数据# 读取串口缓冲区中的所有数据 data uart1.read() if data: print(收到数据:, data)方法3先检查有多少数据可读# 检查接收缓冲区中有多少字节可读 if uart1.any(): # 返回可读的字节数 data uart1.read(uart1.any()) # 读取所有可读数据 print(收到数据:, data)我一般用第三种方法因为它最灵活不会阻塞程序。3.4 完整示例双向通信下面是一个完整的例子实现ESP32-S3通过UART1和电脑双向通信from machine import UART import time # 初始化UART1 # 注意这里我用了GPIO17和18你可以根据实际连接修改 uart1 UART(1, baudrate115200, tx17, rx18) # 计数器用于发送不同的内容 counter 0 while True: # 1. 发送数据到电脑 message fESP32-S3发送: 计数{counter}\r\n uart1.write(message) print(f已发送: {message.strip()}) # 2. 检查是否收到电脑发来的数据 if uart1.any(): received_data uart1.read() # 收到的数据是字节类型需要解码成字符串 try: text received_data.decode(utf-8).strip() print(f从电脑收到: {text}) # 可以做个简单的命令响应 if text LED_ON: print(执行: 打开LED) # 这里可以添加控制LED的代码 elif text LED_OFF: print(执行: 关闭LED) # 这里可以添加控制LED的代码 except: # 如果解码失败直接打印字节数据 print(f收到原始字节数据: {received_data}) # 3. 计数器加1等待1秒 counter 1 time.sleep(1)这个程序会每秒发送一次计数信息到电脑实时检查是否收到电脑发来的数据如果收到特定命令如LED_ON可以执行相应操作4. 实战调试技巧与常见问题4.1 串口调试助手的使用在电脑端你需要一个串口调试工具来和ESP32-S3通信。常用的有WindowsPutty、SecureCRT、或者各种串口调试助手Mac/Linuxscreen、minicom、或者图形化的串口工具配置要点选择正确的COM端口设备管理器中查看波特率设置为115200和代码中一致数据位8停止位1无校验无流控制文本模式发送时可以勾选“发送新行”自动添加\r\n4.2 常见问题排查问题1收不到任何数据检查接线TX-RX是否接反GND接了没检查波特率电脑和ESP32的波特率是否一致检查引脚代码中的tx/rx引脚号是否正确检查串口号UART(1, ...)用的是UART1不是UART0问题2收到乱码几乎肯定是波特率不匹配检查两边的波特率设置也可能是数据位、停止位、校验位不匹配问题3发送正常但接收不到电脑发来的数据检查电脑端的串口调试助手是否真的发送了检查ESP32代码中的uart1.any()和read()逻辑尝试发送纯文本避免特殊字符问题4程序下载失败你可能不小心占用了UART0的引脚解决方法换用UART1或UART2避开GPIO43、44UART0默认引脚4.3 高级技巧同时使用UART1和UART2ESP32-S3有两个可用串口你可以同时初始化它们实现更复杂的通信from machine import UART # 初始化UART1和UART2 uart1 UART(1, baudrate115200, tx17, rx18) # 连接电脑 uart2 UART(2, baudrate9600, tx5, rx6) # 连接传感器或其他设备 # UART1用于调试输出 uart1.write(系统启动\r\n) # UART2用于读取传感器数据 if uart2.any(): sensor_data uart2.read() # 处理传感器数据... uart1.write(f传感器数据: {sensor_data}\r\n)这种架构很实用UART1连接电脑用于调试和命令UART2连接传感器、GPS模块等外设。5. 实际项目中的应用思路掌握了基础操作后你可以把这些知识用到实际项目中场景1数据采集系统用UART2连接温湿度传感器、气压传感器等定期读取数据然后通过UART1发送到电脑上位机显示。场景2设备控制电脑通过串口发送控制命令ESP32-S3解析命令后控制继电器、电机、LED等。场景3多设备通信ESP32-S3作为主设备通过UART连接多个从设备每个从设备有独立地址实现Modbus等协议通信。场景4调试信息输出在代码关键位置添加串口打印通过uart1.write()输出变量值、状态信息方便调试。最后分享一个我实际项目中的小技巧在正式代码中我会把所有的print()改成通过UART输出这样即使设备部署在现场也能通过串口查看运行日志。同时我会定义一个简单的通信协议比如电脑发送?statusESP32回复当前状态电脑发送!resetESP32执行重启电脑发送led,1ESP32打开LED这样就能实现基本的远程监控和控制了。好了关于ESP32-S3的MicroPython串口通信就讲到这里。关键就是避开UART0正确配置引脚和参数然后write()发送、read()接收。多动手试试遇到问题按上面的排查思路检查很快就能掌握。
6. ESP32-S3 MicroPython串口通信实战:从参数配置到UART1/2数据收发
ESP32-S3 MicroPython串口通信实战从参数配置到UART1/2数据收发最近在玩ESP32-S3开发板发现很多朋友在MicroPython环境下搞不定串口通信。要么是引脚配置不对要么是收不到数据要么就是和下载调试用的串口冲突了。今天我就结合自己的踩坑经验手把手带你搞定ESP32-S3的串口通信从参数配置到实际收发数据让你一次弄明白。1. 串口通信基础先搞懂这些关键参数在动手写代码之前咱们得先搞清楚串口通信的几个关键参数。你可以把串口想象成两个人打电话这些参数就是约定好的通话规则两边必须一致才能正常沟通。1.1 核心参数详解波特率Baud Rate这是通信的速度单位是bps比特每秒。常见的波特率有9600、115200等。注意通信双方比如你的ESP32和电脑必须设置相同的波特率否则收到的就是乱码。ESP32-S3支持很宽的波特率范围从110到5000000 bps但最常用的是115200。数据位Data Bits每个数据包可以理解为一个字符包含多少位数据。通常是8位因为一个ASCII字符就是8位。当然也可以是5、6、7位但8位最常用。停止位Stop Bits用来表示一个数据包传输结束的标志。通常是1位也可以是1.5位或2位。停止位越多不同设备时钟同步的容忍度越高但传输速度会变慢。一般用1位就够了。校验位Parity Bits简单的错误检查机制。比如奇校验就是确保数据位中“1”的个数是奇数。如果接收方发现不符合就知道数据可能出错了。这个参数也可以设置为“无校验”很多简单通信场景下不用。提示对于ESP32-S3和电脑通过CH340模块通信这种常见场景最常用的参数组合是波特率115200、数据位8、停止位1、无校验。记住这个组合能解决90%的问题。1.2 串口的工作模式串口通信有三种工作模式理解这个有助于你设计通信逻辑单工模式数据只能单向传输就像广播只能听不能说。半双工模式可以双向传输但不能同时进行。就像对讲机说的时候不能听听的时候不能说。全双工模式可以同时双向传输。就像打电话可以边说边听。ESP32-S3的UART支持全双工模式这也是最常用的模式。2. ESP32-S3的串口资源与硬件连接2.1 三个串口但有一个不能用ESP32-S3内部有三个硬件串口UART0、UART1、UART2。但这里有个大坑要注意UART0已经被开发板的自动下载和调试功能占用了这意味着如果你用UART0去连接其他设备通信很可能会和下载程序的功能冲突导致各种奇怪的问题。所以在实际项目中强烈建议只用UART1和UART2。好消息是UART1和UART2的引脚可以灵活配置几乎可以用任何GPIO引脚作为TX发送和RX接收脚。2.2 硬件连接用CH340模块连接电脑要和电脑通信你需要一个USB转串口模块。最常用的就是CH340模块价格便宜用起来也简单。连接步骤准备CH340模块确保你有一个CH340模块常见的是CH340G或CH340E型号。安装驱动Windows系统通常插上USB后会自动安装驱动。如果没识别需要手动安装。Mac/Linux系统需要下载并安装对应的驱动。驱动可以在开发板的资料包中找到路径通常是资料下载中心→【入门手册资料】百度网盘资料→第05章 开发工具→CH340驱动.zip。硬件连线CH340模块的TX引脚 → ESP32-S3的RX引脚比如GPIO9CH340模块的RX引脚 → ESP32-S3的TX引脚比如GPIO10CH340模块的GND引脚 → ESP32-S3的GND引脚必须接CH340模块的VCC引脚 → 如果需要给模块供电可以接3.3V或5V看模块支持注意串口通信中TX发送端要接对方的RX接收端RX要接对方的TX千万别接反了GND一定要共地否则通信不稳定。连接好后把CH340模块插到电脑USB口在设备管理器中应该能看到一个新的COM口Windows或ttyUSB设备Linux/Mac。3. MicroPython串口编程实战理论说完了咱们直接上代码。我会从最简单的例子开始逐步深入。3.1 基础配置初始化串口在MicroPython中串口操作主要通过machine.UART类来实现。先看一个最基础的初始化例子from machine import UART import time # 初始化UART1波特率115200TX用GPIO10RX用GPIO9 uart1 UART(1, baudrate115200, tx10, rx9) print(UART1初始化完成)代码解释from machine import UART导入UART模块UART(1, ...)第一个参数是串口号1表示UART12表示UART2baudrate115200设置波特率为115200tx10, rx9指定TX引脚为GPIO10RX引脚为GPIO9引脚选择技巧 ESP32-S3的大部分GPIO都可以用作UART引脚但要注意避开一些特殊功能的引脚。我一般喜欢用这些UART1TX17, RX18 或者 TX10, RX9UART2TX8, RX7 或者 TX5, RX63.2 发送数据把数据“说”出去发送数据超级简单用write()方法就行# 发送字符串 uart1.write(Hello ESP32-S3!\r\n) # 发送字节数据 data_to_send b\x01\x02\x03\x04 # 字节数组 uart1.write(data_to_send) # 发送数字需要先转成字符串或字节 number 12345 uart1.write(str(number)) # 发送字符串12345 uart1.write(number.to_bytes(2, big)) # 发送2字节的二进制数据注意write()方法发送的是字节数据。如果你发送字符串MicroPython会自动转换成字节。但发送数字时需要手动转换。\r\n是回车换行在串口调试助手中显示为换行。3.3 接收数据听听对方“说”什么接收数据有几种方式根据你的需求选择方法1读取指定长度的数据# 尝试读取10个字节 data uart1.read(10) if data: print(收到数据:, data)方法2读取所有可用数据# 读取串口缓冲区中的所有数据 data uart1.read() if data: print(收到数据:, data)方法3先检查有多少数据可读# 检查接收缓冲区中有多少字节可读 if uart1.any(): # 返回可读的字节数 data uart1.read(uart1.any()) # 读取所有可读数据 print(收到数据:, data)我一般用第三种方法因为它最灵活不会阻塞程序。3.4 完整示例双向通信下面是一个完整的例子实现ESP32-S3通过UART1和电脑双向通信from machine import UART import time # 初始化UART1 # 注意这里我用了GPIO17和18你可以根据实际连接修改 uart1 UART(1, baudrate115200, tx17, rx18) # 计数器用于发送不同的内容 counter 0 while True: # 1. 发送数据到电脑 message fESP32-S3发送: 计数{counter}\r\n uart1.write(message) print(f已发送: {message.strip()}) # 2. 检查是否收到电脑发来的数据 if uart1.any(): received_data uart1.read() # 收到的数据是字节类型需要解码成字符串 try: text received_data.decode(utf-8).strip() print(f从电脑收到: {text}) # 可以做个简单的命令响应 if text LED_ON: print(执行: 打开LED) # 这里可以添加控制LED的代码 elif text LED_OFF: print(执行: 关闭LED) # 这里可以添加控制LED的代码 except: # 如果解码失败直接打印字节数据 print(f收到原始字节数据: {received_data}) # 3. 计数器加1等待1秒 counter 1 time.sleep(1)这个程序会每秒发送一次计数信息到电脑实时检查是否收到电脑发来的数据如果收到特定命令如LED_ON可以执行相应操作4. 实战调试技巧与常见问题4.1 串口调试助手的使用在电脑端你需要一个串口调试工具来和ESP32-S3通信。常用的有WindowsPutty、SecureCRT、或者各种串口调试助手Mac/Linuxscreen、minicom、或者图形化的串口工具配置要点选择正确的COM端口设备管理器中查看波特率设置为115200和代码中一致数据位8停止位1无校验无流控制文本模式发送时可以勾选“发送新行”自动添加\r\n4.2 常见问题排查问题1收不到任何数据检查接线TX-RX是否接反GND接了没检查波特率电脑和ESP32的波特率是否一致检查引脚代码中的tx/rx引脚号是否正确检查串口号UART(1, ...)用的是UART1不是UART0问题2收到乱码几乎肯定是波特率不匹配检查两边的波特率设置也可能是数据位、停止位、校验位不匹配问题3发送正常但接收不到电脑发来的数据检查电脑端的串口调试助手是否真的发送了检查ESP32代码中的uart1.any()和read()逻辑尝试发送纯文本避免特殊字符问题4程序下载失败你可能不小心占用了UART0的引脚解决方法换用UART1或UART2避开GPIO43、44UART0默认引脚4.3 高级技巧同时使用UART1和UART2ESP32-S3有两个可用串口你可以同时初始化它们实现更复杂的通信from machine import UART # 初始化UART1和UART2 uart1 UART(1, baudrate115200, tx17, rx18) # 连接电脑 uart2 UART(2, baudrate9600, tx5, rx6) # 连接传感器或其他设备 # UART1用于调试输出 uart1.write(系统启动\r\n) # UART2用于读取传感器数据 if uart2.any(): sensor_data uart2.read() # 处理传感器数据... uart1.write(f传感器数据: {sensor_data}\r\n)这种架构很实用UART1连接电脑用于调试和命令UART2连接传感器、GPS模块等外设。5. 实际项目中的应用思路掌握了基础操作后你可以把这些知识用到实际项目中场景1数据采集系统用UART2连接温湿度传感器、气压传感器等定期读取数据然后通过UART1发送到电脑上位机显示。场景2设备控制电脑通过串口发送控制命令ESP32-S3解析命令后控制继电器、电机、LED等。场景3多设备通信ESP32-S3作为主设备通过UART连接多个从设备每个从设备有独立地址实现Modbus等协议通信。场景4调试信息输出在代码关键位置添加串口打印通过uart1.write()输出变量值、状态信息方便调试。最后分享一个我实际项目中的小技巧在正式代码中我会把所有的print()改成通过UART输出这样即使设备部署在现场也能通过串口查看运行日志。同时我会定义一个简单的通信协议比如电脑发送?statusESP32回复当前状态电脑发送!resetESP32执行重启电脑发送led,1ESP32打开LED这样就能实现基本的远程监控和控制了。好了关于ESP32-S3的MicroPython串口通信就讲到这里。关键就是避开UART0正确配置引脚和参数然后write()发送、read()接收。多动手试试遇到问题按上面的排查思路检查很快就能掌握。