我是靠谱客的博主 冷傲钻石,最近开发中收集的这篇文章主要介绍esp8266 UART 增大接收缓存,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

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);

最后

以上就是冷傲钻石为你收集整理的esp8266 UART 增大接收缓存的全部内容,希望文章能够帮你解决esp8266 UART 增大接收缓存所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(41)

评论列表共有 0 条评论

立即
投稿
返回
顶部