大家都是用什么方式判断串口接收一段数据结束的呢

2019-12-20 21:46发布

在使用GSM模块的时候,需要通过串口与模块进行通信。

这其中既有命令反馈的接收,也有通信数据的接收,它们的数据长度和接收的延迟都不一样。

我目前的做法是:串口接收到第一个数据的时候开始计时,如果接收到下一个数据则将计时清零,如果超时则判别一段数据接收完毕

我感觉这样做的效率有点低,好像无法利用DMA,不知道大家有什么好的方式呢?

我看手册上说STM32的串口有总线闲时中断,不知道这个是什么状况,可否利用一下呢?
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
28条回答
Appcat
1楼-- · 2019-12-22 10:20
GSM应用判断接收完成不能用超时,AT指令有两类,一类是直接和模块交互,这种指令的回复时间相对固定,还有一类是需要和网络交互的,由于网络忙碌状态不可预知,所以指令返回时间不定。超时只能用着判断网络指令是否失效需要重来。
伍师傅32
2楼-- · 2019-12-22 15:01
 精彩回答 2  元偷偷看……
fengchi
3楼-- · 2019-12-22 18:22
伍师傅32 发表于 2015-2-10 09:51
这个空闲中断的触发条件是 由工作状态到空闲状态这个变化动作触发的 还是 只要处于空闲状态就会触发 ?

...

后者,上电复位会有一次中断,以后就是工作到空闲会中断一次
伍师傅32
4楼-- · 2019-12-22 20:30
wicy001 发表于 2015-2-10 10:34
在没有空闲中断的MCU,用定时器判断一帧。 但在stm32/stm8上,都有空闲中断,可以用空闲中断来判断一帧数据 ...

使用了你的驱动,非常的感谢!

在接收处,我添加了需要接收的字符长度的判别。

因为在测试过程中,我发现GSM模块与单片机进行通信时数据并不是连续发送的。尤其是HTTP GET时,一次传输的数据量大,中间会出现许多次不确定的空闲中断。
wicy001
5楼-- · 2019-12-22 22:30
伍师傅32 发表于 2015-2-13 16:04
使用了你的驱动,非常的感谢!

在接收处,我添加了需要接收的字符长度的判别。


每次接收完一帧数据, 字节个数到保存变量Rcv1Counter中。

对你说的出现不确定空闲中断,应该是发送端,发送数据有延迟造成的。可以增大串口接收缓冲,将想要数据全部接收下来,再判断。 另外可以改造成环形缓冲区。

对于数据的处理,请参考苹果猫的建议。  




伍师傅32
6楼-- · 2019-12-22 23:06
wicy001 发表于 2015-2-13 17:04
每次接收完一帧数据, 字节个数到保存变量Rcv1Counter中。

对你说的出现不确定空闲中断,应该是发送端, ...

嗯,做了环形缓存,目前效果不错

一周热门 更多>