ESP32通过Serial2经RS485发送十六进制数据失败求助
RS485通信无输出问题排查
问题描述
我需要通过RS485通信,把十六进制数据从ESP32 WROOM发送到继电器模块,使用的RS485模块是SN75H12VD。ESP32的Rx引脚接16、Tx引脚接17,使能引脚接4且已设为高电平。我尝试用HardwareSerial(Serial2)实现,但通过串口终端检查始终没有数据输出,以下是我的代码:
代码
#include <Arduino.h> #include <HardwareSerial.h> #define RXD2 16 #define TXD2 17 #define enable_pin 4 HardwareSerial mySer(2); void setup() { Serial.begin(115200); Serial.println("hi"); mySer.begin(9600, SERIAL_8N1, RXD2, TXD2); pinMode(RXD2, INPUT); pinMode(TXD2, OUTPUT); pinMode(enable_pin, OUTPUT); delay(10); digitalWrite(enable_pin, HIGH); } void loop() { if (!mySer) { // 如果对象初始化失败,说明配置无效 Serial.println("Invalid pin configuration, check config"); while (1) { // 配置无效时停止运行 delay (1000); } } else { Serial.println("hello"); mySer.println("hey"); mySer.write(0x13); mySer.write(0x01); mySer.write(0x03); mySer.write(0x40); mySer.write(0x02); mySer.write(0x01); mySer.write(0x00); mySer.write(0xC9); mySer.write(0x80); mySer.write(0x0A); delay(2000); mySer.write(0x13); mySer.write(0x01); mySer.write(0x03); mySer.write(0x40); mySer.write(0x02); mySer.write(0x00); mySer.write(0x00); mySer.write(0xC8); mySer.write(0x10); mySer.write(0x0A); delay(2000); } }
排查要点
- 移除手动引脚模式配置:调用
mySer.begin()后,ESP32会自动配置串口引脚的输入输出模式,手动执行pinMode(RXD2, INPUT)和pinMode(TXD2, OUTPUT)可能干扰串口正常工作,建议删除这两行代码。 - 确认RS485使能逻辑与时序:核对SN75H12VD的 datasheet,确认DE/RE引脚的电平要求(通常高电平为发送模式)。可将
digitalWrite(enable_pin, HIGH)移到mySer.begin()之前,并延长延迟到100ms,确保使能信号稳定后再发送数据。 - 验证Serial2本身可用性:暂时绕开RS485模块,将ESP32的TXD2引脚直接接到USB转串口模块的RX引脚,用串口终端查看是否能收到
mySer.println("hey")的内容,确认Serial2硬件本身正常。 - 修正初始化判断逻辑:ESP32 Arduino核心中,
if (!mySer)的判断并不准确,建议在setup函数中添加Serial.print("Serial2 initialized: "); Serial.println(mySer);来验证初始化状态。 - 简化测试代码:先注释掉批量十六进制发送代码,只保留
mySer.write(0xAA)这类单字节测试数据,用示波器或逻辑分析仪观察TXD2引脚的波形,确认是否有信号输出。 - 检查引脚冲突:确认16、17引脚未被ESP32其他外设(如SPI、I2C、SD卡等)占用,部分开发板可能将这些引脚复用为其他功能。
内容的提问来源于stack exchange,提问作者RBM
相关产品推荐
相关产品推荐

