转自:http://www.openedv.com/posts/list/0/11804.htm#top 串口字节处理超时------这个帖子写的很全面,很强大,看这个一个就足够!!!!
(二)、软件定时器
软件定时器是由一个硬件定时器实现的多个定时器,在定时不要求非常精确的情况下可以用到,比如串口字节超时等等,特点是需要多少个定时器就可以拥有多少个定时器,不受硬件限制。这里的软件定时器源代码soft_timer.c和soft_timer.h两个文件,在不做任何改动的情况在ARM和51下测试通过,其他平台未知,(没有相应的硬件平台测试)。先放代码和工程,后面有时间在细说。
使用方法(平台无关):
(1)硬件定时器初始化,中断配置什么的不要忘了,具体怎么实现无所谓,只要能不停地周期性中断(stm32的systick最合适了),中断间隔也是软件定时器的最小能分辨的间隔,然后将软件定时器刷新函数void timer_periodic_refresh()--没有参数--加到你的定时器中断服务函数里。
(2)定义一个定时器,如:struct soft_timer timer,struct soft_timer 是软件定时器的结构体,定义在soft_timer.h文件中,timer是你的定时器的名字。
(3)软件定时器链表复位,soft_timer_list_reset(),无参数;
(4)然后添加刚才你定义的定时器timer添加到定时器链表add_timer(&timer,timer_over_proc,time_count),第一个参数是你要添加的定时器结构体的指针,第二个参数是定时间到了你要调用的超时函数,第三个参数是定时时间,单位是你的周期性中断时间间隔。
(5)开始启动定时器, start_timer(&timer),参数是你要启动的定时器的结构体指针。
这样,等超时后,就会自动调用timer_over_proc()函数,(像不像我们自己实现的软件定时器中断?)
注意,这个实现是一次性定时器,即一次超时后不再触发,若需要周期性触发,那么可以再timer_over_proc()函数里面重装初值--reload_timer(&timer,time_count),第一个r参数是待启动定时器结构体指针,time_count是重装值,单位依旧是你的硬件定时器中断时间间隔,然后再启动定时器start_timer(timer)即可。
若还有使用上的问题,可参考两个测试工程的用法,一个stm32,一个51。STM32测试工程以systick建了3个软件定时器,分别以0.3s,0.5s,0.7s的时间间隔闪烁3个led灯。C51工程以定时器0建立3个软件定时器闪烁led灯。具体代码分析,后面有时间在细说。
STM32的测试结果视频和代码见附件。
(三)软件定时器实现串口字节超时处理
前面第一个工程是以前的一个小项目上用的,原封不动地发了上来,结构除了自个儿比较清晰外可能不会有人知道我再干什么。。。。。。所以写了这个软件定时器的版本,并做了充分的中文注释。欢迎指正!
同前面的一样,每个串口用了两个缓冲区,一个接收缓冲区,一个准备缓冲区。当串口中断函数里面收到一个字符时,放入接收缓冲区,并开始启动定时器,若在超时范围内没有收到下一个字符,超时函数会被自动调用,将接收缓冲区的数据转移至准备缓冲区内,并将准备标志置位,以供应用程序查询。
测试工程里面使用了串口1、2,简单回发收到的数据帧,为了对比,这两个串口的字节超时设置不一样,一个50ms,一个500ms,所以串口2在发送比较快的情况会被认为数据没有结束,直到至少停500ms才会回发。在我的板子上测试通过,由于手上没有串口3、4、5的板子,所以就没添加,需要的朋友可自己添加一下,还是比较容易的。
写完了,不知道有人试过我这个软件定时器么?以满足下我小小的虚荣心啊,哈哈哈
http://www.amobbs.com/thread-5486343-1-1.htmlSTM32实现USART+DMA接收未知长度的数据和发送
http://www.amobbs.com/thread-5496013-1-1.html
http://www.th7.cn/Program/cp/2012/06/19/81266.shtml
http://group.ednchina.com/GROUP_MES_14262_619_18511_1.HTM
http://likang0110.blog.163.com/blog/static/119810201201286111128718/
http://www.eefocus.com/bbs/article_244_111154.html
http://www.9mcu.com/9mcubbs/forum.php?mod=viewthread&tid=955855 stm32 usart接收中断超时处理