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

2019-12-20 21:46发布

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

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

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

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

我看手册上说STM32的串口有总线闲时中断,不知道这个是什么状况,可否利用一下呢?
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
28条回答
伍师傅32
1楼-- · 2019-12-21 18:24
fengchi 发表于 2015-2-10 09:39
空闲中断+DMA,如果是F0系列可以是超时中断+DMA,已经验证过,好用

这个空闲中断的触发条件是 由工作状态到空闲状态这个变化动作触发的 还是 只要处于空闲状态就会触发 ?

如果是后者,应该还需要在 空闲中断里 判断是否是上电复位时进入的空闲状态?
yinglively
2楼-- · 2019-12-21 18:39
楼主不要质疑猫侠的话,猫侠可是这样面的行家!
如果你不信,就自己去翻手册吧。
伍师傅32
3楼-- · 2019-12-21 23:11
 精彩回答 2  元偷偷看……
wicy001
4楼-- · 2019-12-22 03:00
在没有空闲中断的MCU,用定时器判断一帧。 但在stm32/stm8上,都有空闲中断,可以用空闲中断来判断一帧数据,很方便,还可以DMA接收不定长的一帧。

我把驱动放在这个帖子里了。
http://www.amobbs.com/thread-5611771-1-1.html
dzymushi
5楼-- · 2019-12-22 06:12
不要质疑大猫侠。
指令都是“ ”结束的
         for(;;)
                 {
                  memset(userPacket,0,606);
                   rxIndex=0;
              UART0_send("AT+CSMINS? ");         
                  gsmWaitDalays(10);
                  if(NULL!=strstr(userPacket,"0,1"))
                     break;
                  else
                            gprsRetry++;
                  if(gprsRetry>=20)
                         return 0x03;//没有SIM卡
                  }
杨遥
6楼-- · 2019-12-22 07:31
比如用100多个byte在中断里一直循环接收数据。在主循环中读出来进行判断。

一周热门 更多>