本帖最后由 djz1992 于 2020-9-1 11:22 编辑
我的数据主要是三部分。
第一是AT指令;第二进入透传后的MQTT数据;第三是OTA时候的http格式数据。
这三部分数据情况都不一样,而且长度都不一定。
AT指令的回复有快有慢,有分段。
MQTT的数据不是一发一收,服务器说不定就来数据。
OTA的数据量大,http服务器那边没有分包。
捣鼓了三天。
一开始是空闲中断+DMA接收,遇到下载bin文件,数据量超过DMA缓冲区长度的时候会有问题,搞了个双缓冲。
问题来了,串口空闲中断经常把一帧数据分成两节来接收,结果放在两个缓冲区内。AT指令的回复判断都出错。好吧,加一个环形缓冲,把DMA收到的都复制出来。
一开始确实不错效果,分段的数据都被拼接到一起了,但是环形缓冲的数据是环形的。在用strstr判断是否有字符串的时候,判断范围不好控制,给了head,结尾是用\0截至,得添加一个。
在环形缓冲区里添加会混乱,又用定时器去判断是不是有数据,有就读出来。然后搞个超时,来判断后面确实没有了,可以开始处理了,再添加\0。
结果我这个菜鸟,越搞越复杂,还各种bug。
算了,老老实实的中断字节接收吧。。。
空闲中断和DMA的使用感觉还是有局限性的。
为什么一帧数据的中途会触发一次甚至几次空闲中断?如果一帧数据收完才触发空闲中断,那就舒服了啊。。。
@m564522634 @xyz549040622 @dirtwillfly
|