You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

通过串口监视器调试ESP8266与Arduino Uno通信及数据传输故障

优先级最高:跨模块通信调试方案

你可以按以下步骤先确认两个MCU的串口通信是否正常,不需要依赖USB打印输出也能验证:

  • 先写最简测试代码,强制两个模块的串口波特率完全一致,比如都设为9600,不要用不同波特率,这是90%以上同板串口通信失败的原因
    • Arduino Uno端测试代码逻辑:每隔1秒通过Serial.write()发送固定字符串,比如"TEST:123\n",同时可以加个LED闪烁提示发送动作(用板载13号引脚LED,每发一次闪一次)
    • ESP8266端测试代码逻辑:收到串口数据后,直接让自己的板载LED闪2次,同时把收到的数据暂存,如果你已经写了POST逻辑,可以直接把收到的数据作为POST请求的payload发到你自己的服务端,看服务端能不能收到正确内容,这个是最直观的验证方式
  • 如果没有服务端可以做回环验证:让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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 11:57:02