你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

串口接收延时问题

[复制链接]
hhhhhhhaa 提问时间:2018-11-20 09:01 /
求助一个问题,简单描述一下,我现在通过串口1发送一个数据出去,同时开启定时器,在五分钟内如果有数据返回,表示通讯成功,如果没有表示通讯失败,现在有一个疑问,我如果开启定时器以后,单片机是执行定时器去了,还是一直循环接收?
收藏 评论24 发布时间:2018-11-20 09:01

举报

24个回答
hhhhhhhaa 回答时间:2018-12-4 15:17:37
党国特派员 发表于 2018-12-3 17:36
就是一个接收超时的检测。关键是在接收的这段时间里你还要不要MCU去处理其它事情。
1、接收时MCU不处理其它 ...

您说的很好,我现在设计的这个就是串口通讯,不做别的,相当于一个串口测试工具,把需要发送和接收的数据储存在MCU里,然后通过触摸屏来发送接收数据,测试各个串口,加上了定时器,还挺好用的,以前不懂定时器,用的是延时,结果延时的时候MCU都来处理延时了,接收了数据也收不到了,所以后来开始学习定时器,感觉挺方便的,设置好定时器后,开启定时器,就可以一直扫描串口接收到的数据,如果定时器到五分钟了还没有收到数据,说明设备有问题,直接跳出扫描,根据不同的串口,设置不同的等待时间,开启不同的定时器,哈哈,已经试验成功了,现在正在测量电池的电压问题,ADC 两个电阻搞定,正在测试程序和完善界面
党国特派员 回答时间:2018-12-3 17:36:29
就是一个接收超时的检测。关键是在接收的这段时间里你还要不要MCU去处理其它事情。
1、接收时MCU不处理其它事情,就是检测是否有数据到达,那就简单。发完成后,开一个计时器(timer,systick)都可以,1秒中记数一次,在接收检测函数里读一下时间做判断。
2、接收时MCU还要处理其它的事情,这个就是要在接收中断里来接收数据。发完成后,开一个5分钟的定时器,只要定时器中断触发了,说明接收超时了。如果在5分钟(中断)内接到数据,立马停止定时器。接收成功。这种就相当于异步通讯。异步处理起来相当麻烦。首先你得发送和接收一一对应,还有可能出现接收乱序的问题。如果没有OS支持,那是相当的痛苦。

评分

参与人数 1ST金币 +5 蝴蝶豆 +2 收起 理由
STMCU + 5 + 2

查看全部评分

STM1024 回答时间:2018-11-20 15:09:01
hhhhhhhaa 发表于 2018-11-20 15:01
因为我接收数据是要在5分钟内的任意时刻都可以,不能用中断的,需要一直检查有没有收到数据 ...

可能我没表达清楚。
1.串口发送数据前,定时器配置好,但是未使能。
2.串口发送数据后,定时器使能,开启五分钟倒计时
3.while循环里面检查串口数据,如果:
3.1 5分钟内收到数据,则认为未超时,失能定时器,然后主循环做有应答的逻辑
3.2 5分钟后未收到数据,定时器中断被触发,修改标识超时的全局变量,失能定时器,主循环中做超时无应答的逻辑
为什么一定不能用中断呢?有其他原因吗?
奏奏奏 回答时间:2018-11-20 09:04:43
这个需要你将代码具体贴出来分析,要不然你画流程图出来也行
因为有很多细节没有交代清楚

评分

参与人数 1蝴蝶豆 +2 收起 理由
STMCU + 2

查看全部评分

STM1024 回答时间:2018-11-20 09:06:17
思路没问题的,配置好定时器之后,就可以不用在while循环里面管定时器的事情了,然后定时器中断到来的时候你再做处理就行

评分

参与人数 1蝴蝶豆 +2 收起 理由
STMCU + 2

查看全部评分

废鱼 回答时间:2018-11-20 09:09:48
用中断接收,然后检测是否收到应答数据,再做超时判断。

评分

参与人数 1蝴蝶豆 +2 收起 理由
STMCU + 2

查看全部评分

zjczm 回答时间:2018-11-20 09:55:09
如果别的事情都不干,一直等待接收也可以。
或者,你可以不用循环中等待。可以定期或不定期去查询是否接收到数据。
当然,中断也是可以的。

评分

参与人数 1蝴蝶豆 +2 收起 理由
STMCU + 2

查看全部评分

andey 回答时间:2018-11-20 10:55:13
提示: 作者被禁止或删除 内容自动屏蔽
五哥1 回答时间:2018-11-20 13:24:21
用时间片轮大法
hhhhhhhaa 回答时间:2018-11-20 15:00:11
stm1024 发表于 2018-11-20 09:06
思路没问题的,配置好定时器之后,就可以不用在while循环里面管定时器的事情了,然后定时器中断到来的时候 ...

我现在设置了一个500ms的定时器,如果不管这个定时器的话,500ms就会中断一次,计数器加1,等计数器到达我需要的时间后,执行跳出循环,同时停止失能定时器,清除中断标记,如果在我规定的时间内有数据返回,显示返回的数据并失能定时器,清除中断标记。等待下一次按键发送数据,发送完数据后开启定时器
hhhhhhhaa 回答时间:2018-11-20 15:01:42
安 发表于 2018-11-20 09:09
用中断接收,然后检测是否收到应答数据,再做超时判断。

因为我接收数据是要在5分钟内的任意时刻都可以,不能用中断的,需要一直检查有没有收到数据
废鱼 回答时间:2018-11-20 15:05:32
数据读取不及时,会有溢出的风险,所以还是用中断接收放入缓冲区,其他地方再对缓冲区进行判断处理。如果能够保证数据很快读取走,可以做逻辑处理
if(systick-a<300*1000)
{
//判断串口接收标志位
//接收数据,并处理
}
TLLED 回答时间:2018-11-20 16:46:14
我觉得可以这样处理,串口1数据输出数据后, 打开定时器,串口接收要使用中断接收,不要使用循环查询方式,否则会出现丢数据现象,使用中断不影响,在规定的时间内接收到数据后,把有关接收定时器的变量清零,没有接收到数据就去判断超时处理。
hhhhhhhaa 回答时间:2018-11-20 17:09:29
stm1024 发表于 2018-11-20 15:09
可能我没表达清楚。
1.串口发送数据前,定时器配置好,但是未使能。
2.串口发送数据后,定时器使能,开启 ...

额,定时器中断后,还是会继续啊,是不是要在中断里把定时器失能啊?因为我没用过定时器,现在也是找了一个例子
hhhhhhhaa 回答时间:2018-11-20 17:10:26
安 发表于 2018-11-20 15:05
数据读取不及时,会有溢出的风险,所以还是用中断接收放入缓冲区,其他地方再对缓冲区进行判断处理。如果能 ...

大神,你说的这个太高深,我看不懂,我初学这个。。。。
hhhhhhhaa 回答时间:2018-11-20 17:11:36
TLLED 发表于 2018-11-20 16:46
我觉得可以这样处理,串口1数据输出数据后, 打开定时器,串口接收要使用中断接收,不要使用循环查询方式, ...

嗯,我就是一直在查询接收的数据,和您说的差不多
12下一页
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版