通过串口监视器调试ESP8266与Arduino Uno通信及数据传输故障
优先级最高:跨模块通信调试方案
你可以按以下步骤先确认两个MCU的串口通信是否正常,不需要依赖USB打印输出也能验证:
- 先写最简测试代码,强制两个模块的串口波特率完全一致,比如都设为9600,不要用不同波特率,这是90%以上同板串口通信失败的原因
- Arduino Uno端测试代码逻辑:每隔1秒通过
Serial.write()发送固定字符串,比如"TEST:123\n",同时可以加个LED闪烁提示发送动作(用板载13号引脚LED,每发一次闪一次) - ESP8266端测试代码逻辑:收到串口数据后,直接让自己的板载LED闪2次,同时把收到的数据暂存,如果你已经写了POST逻辑,可以直接把收到的数据作为POST请求的payload发到你自己的服务端,看服务端能不能收到正确内容,这个是最直观的验证方式
- Arduino Uno端测试代码逻辑:每隔1秒通过
- 如果没有服务端可以做回环验证:让ESP8266收到数据后,立刻通过串口回发一个
"OK\n"给Uno,Uno收到后让自己的LED闪3次,只要能触发对应的闪烁动作,就说明双向通信正常
DIP开关配置的常见坑
你提到的1、2、3、4号开关全开启的配置,实际是把USB-TTL同时挂载到两个MCU的串口上,会出现串口抢占问题,反而会导致通信失败,正确的配置分场景:
- 给Arduino Uno上传代码时:开3、4号开关,关1、2号
- 给ESP8266上传代码时:开1、2号开关,关3、4号
- 两个模块正常通信,同时要通过USB看ESP8266的调试打印时:开1、2号,关3、4号,ESP8266的调试打印直接输出到USB串口
- 两个模块正常通信,同时要通过USB看Arduino Uno的调试打印时:开3、4号,关1、2号,Uno的调试打印直接输出到USB串口
- 两个模块互相通信不需要USB调试时:1、2、3、4号全关,两个模块的串口直接互连,不会被USB干扰
代码层面的修正建议
- 不要直接用
Serial.get()接收,建议先判断串口缓冲区是否有数据:if(Serial.available() > 0)再读,避免读空数据 - 数据最好加固定的开头结尾标识,比如用
[开头,]结尾,发送[TEMP:25.5,HUM:60],接收端只解析符合格式的内容,避免串口干扰产生的乱码 - 不要在
loop()里无延迟连续发送,最好加100ms以上的发送间隔,避免缓冲区塞满丢数据
内容的提问来源于stack exchange,提问作者felixbmmm
相关产品推荐
相关产品推荐

