esp8266 UART 增大接收缓存

本文探讨了使用ESP8266作为ZigBee网关时遇到的串口接收缓冲区问题。当接收的字符串长度超过100字符时,ESP8266无法完整读取数据,导致串口接收回调函数被错误地调用两次。通过分析,发现这是由于默认的full中断触发条件所导致。文章提供了临时解决方案,即修改uart.c文件中uart0_rx_intr_handler()函数的full中断条件分支,并提出更优方案,如增加接收缓冲区大小。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

ESP8266串口接收缓存问题

背景:
使用esp8266作为zigbee网关,8266串口接收协调器发送的字符串(长度约为110),对其解析后,生成JSON字符串,然后通过wifi上传到服务器。字符串示例:

update:TH101,24.0,60,60,153;TH101,4.0,10,10,25;XX102,24.0,60,60,153;XX103,24.0,60,60,153;XX104,24.0,60,60,199;

它包含了五个教室的信息,各个数值的含义是约定好的,包括亮度、温湿度等。
问题:
此前已经实现了串口接收功能。现在字符串变长了,8266不能正确读取最后几个数值,而且串口接收回调函数似乎被调用了两次。如果注释回调中的所有代码,仅仅把接收到的内容原样发回,就没有任何问题。
原因:
调试发现,回调被调用了两次,且第一次接收到100字符,第二次是剩下的10个字符。查文档得知,默认情况下,触发串口回调的原因有三个:溢出、full和超时。如果接收量超出100会触发full中断,从而导致上面的问题。
解决:
打开uart.c,找到函数uart0_rx_intr_handler(),注释其中full触发中断的条件分支(如下图)。这种方法不是很正规,如果数据很多,导致溢出,就会丢包,最好的方法是增大接收缓存,或full中断触发条件,具体怎么做我还没研究。

// }else if(UART_RXFIFO_FULL_INT_ST == (READ_PERI_REG(UART_INT_ST(uart_no)) & UART_RXFIFO_FULL_INT_ST)){
    //     DBG("f");
    //     uart_rx_intr_disable(UART0);
    //     WRITE_PERI_REG(UART_INT_CLR(UART0), UART_RXFIFO_FULL_INT_CLR);
    //     system_os_post(uart_recvTaskPrio, 0, 0);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值