OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 31209|回复: 48

串口字节超时处理(一)

[复制链接]

3

主题

59

帖子

0

精华

初级会员

Rank: 2

积分
104
金钱
104
注册时间
2012-12-25
在线时间
3 小时
发表于 2013-1-15 17:30:11 | 显示全部楼层 |阅读模式
 
       应此贴http://www.openedv.com/posts/list/6917.htm,给我发邮件的人有好几个,我不一一回了,发在这儿。


      大部分串口都是基于一字节、一字节传输,检测到特定的字符(比如换行或者空格)才判定一帧数据结束,这样的传输机制在自己调试时可以用,但实际运用其实用的很少,最大的坏处是cpu会“死等”特定字符,另外,若是由总线干扰出现的特定的字符,若程序同样判定帧起始(或停止)符,这明显是错误的。我们需要一帧一帧的传输,这样,就需要字节超时处理了,即只要字符与字符之间间隔超过一定的时间,那么就判定字符是一帧的结束。
      大部分教程没有提到可能是为了降低大家的学习难度,这里提供一份参考代码,STM32的所有串口都加进去了,全部测试通过,也经过实际项目(非精确严格要求)的检验。若不需要用到某些串口,只需要把app_conf.h,文件里的相关宏关闭即可。比如,不需要用到串口3、4、5,那么只需要注释掉app_conf.h里的USING_USART3、USING_USART4、USING_USART5即可。同时,串口相关配置波特率、缓冲区大小等等也在此文件,大家看看注释就明白了。默认全部开启,字节超时时间可设,例如USART1_RECEIVE_OVERTIME这类名字的宏。最后一个配置是printf 输出串口的选择,默认为串口一。

      这个实现五个串口公用一个systick,不需要每个串口需要单独的硬件定时器;二级缓冲区以加大吞吐量,一个接受缓冲区,接受缓冲区负责接收;一个帧准备缓冲区,帧准备缓冲区有一个准备好的标志USART_ready_buf_ok,应用程序可检测这个标志看是否有一帧数据存进来。还有一个帧长度USART_ready_buf_len以指示准备好的缓冲区的帧长度。代码先发放出去,大家先试试,稍后有时间在说说具体事怎么实现的,年底比较事多,大家见谅。

    对了,测试代码是简单地回发,即5个串口回发自己收到的数据帧,你可以做个测试,若字节超时时间设的比较长(在app_conf.h文件的USART1_RECEIVE_OVERTIME宏),那么你在串口调试助手里不停地点发送,等到你停下来,才会回发你刚发的内容。

     还有,这个工程LED灯部分也有些意思,除了亮状态和灭状态,还有第三种状态————闪烁,而且闪烁的次数与闪烁的间隔软件可配置。若有兴趣大家也可以试试,配置也在app_conf.h里,当然,你的板子与我的板子肯定不一样,那么"AunonBoard_led.h"里的各个LED_PORT和LED_PIN宏定义也要修改。 

     有问题跟贴回复,我就不一一邮件回了。


ZhyT_V0_3.rar

282.73 KB, 下载次数: 5673

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

59

帖子

0

精华

初级会员

Rank: 2

积分
104
金钱
104
注册时间
2012-12-25
在线时间
3 小时
 楼主| 发表于 2013-1-15 17:35:18 | 显示全部楼层
还有个软件定时器版本,所以定个标题为(一),但还在测试,等差不多了也一并发上来。
回复 支持 反对

使用道具 举报

3

主题

59

帖子

0

精华

初级会员

Rank: 2

积分
104
金钱
104
注册时间
2012-12-25
在线时间
3 小时
 楼主| 发表于 2013-1-15 23:53:49 | 显示全部楼层

(二)、软件定时器

      软件定时器是由一个硬件定时器实现的多个定时器,在定时不要求非常精确的情况下可以用到,比如串口字节超时等等,特点是需要多少个定时器就可以拥有多少个定时器,不受硬件限制。这里的软件定时器源代码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的测试结果视频和代码见附件。

soft_timer.rar

297.28 KB, 下载次数: 3584

VID_20130115_230923.mp4

2.96 MB, 下载次数: 2900

回复 支持 反对

使用道具 举报

3

主题

59

帖子

0

精华

初级会员

Rank: 2

积分
104
金钱
104
注册时间
2012-12-25
在线时间
3 小时
 楼主| 发表于 2013-1-15 23:55:10 | 显示全部楼层

后面就以这个软件定时器实现串口字节超时,估计明后天发吧。
回复 支持 反对

使用道具 举报

10

主题

93

帖子

0

精华

初级会员

Rank: 2

积分
188
金钱
188
注册时间
2012-11-16
在线时间
6 小时
发表于 2013-1-16 12:11:04 | 显示全部楼层
回复【3楼】celticzy:
---------------------------------
没想到 我是第一个回复的  正是需要  昨天发了邮件给你要程序,没想到已经发上来了   谢谢
回复 支持 反对

使用道具 举报

260

主题

809

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1896
金钱
1896
注册时间
2012-10-28
在线时间
357 小时
发表于 2013-1-16 16:39:46 | 显示全部楼层
没想到 我是第 2 个回复的  正是需要  昨天发了邮件给你要程序,没想到已经发上来了   谢谢
回复 支持 反对

使用道具 举报

20

主题

58

帖子

0

精华

初级会员

Rank: 2

积分
158
金钱
158
注册时间
2012-5-7
在线时间
0 小时
发表于 2013-1-16 16:54:37 | 显示全部楼层
没想到 我是第 3 个回复的    谢谢
回复 支持 反对

使用道具 举报

3

主题

59

帖子

0

精华

初级会员

Rank: 2

积分
104
金钱
104
注册时间
2012-12-25
在线时间
3 小时
 楼主| 发表于 2013-1-16 21:41:18 | 显示全部楼层
能帮到大家就好。
回复 支持 反对

使用道具 举报

3

主题

59

帖子

0

精华

初级会员

Rank: 2

积分
104
金钱
104
注册时间
2012-12-25
在线时间
3 小时
 楼主| 发表于 2013-1-16 22:00:01 | 显示全部楼层

(三)软件定时器实现串口字节超时处理

      前面第一个工程是以前的一个小项目上用的,原封不动地发了上来,结构除了自个儿比较清晰外可能不会有人知道我再干什么。。。。。。所以写了这个软件定时器的版本,并做了充分的中文注释。欢迎指正!

      同前面的一样,每个串口用了两个缓冲区,一个接收缓冲区,一个准备缓冲区。当串口中断函数里面收到一个字符时,放入接收缓冲区,并开始启动定时器,若在超时范围内没有收到下一个字符,超时函数会被自动调用,将接收缓冲区的数据转移至准备缓冲区内,并将准备标志置位,以供应用程序查询。

       测试工程里面使用了串口1、2,简单回发收到的数据帧,为了对比,这两个串口的字节超时设置不一样,一个50ms,一个500ms,所以串口2在发送比较快的情况会被认为数据没有结束,直到至少停500ms才会回发。在我的板子上测试通过,由于手上没有串口3、4、5的板子,所以就没添加,需要的朋友可自己添加一下,还是比较容易的。

        写完了,不知道有人试过我这个软件定时器么?以满足下我小小的虚荣心啊,哈哈哈

usart.rar

272.02 KB, 下载次数: 4737

回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165516
金钱
165516
注册时间
2010-12-1
在线时间
2116 小时
发表于 2013-1-17 00:00:21 | 显示全部楼层
过阵子我也发一个,今天刚刚写完,调试GPS用的.
也是用超时处理,发送用dma实现,利用sprintf重构一个printf.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

3

主题

59

帖子

0

精华

初级会员

Rank: 2

积分
104
金钱
104
注册时间
2012-12-25
在线时间
3 小时
 楼主| 发表于 2013-1-20 21:25:56 | 显示全部楼层
回复【10楼】正点原子:
过阵子我也发一个,今天刚刚写完,调试GPS用的. 也是用超时处理,发送用dma实现,利用sprintf重构一个printf.
---------------------------------
坐等。。。
回复 支持 反对

使用道具 举报

8

主题

39

帖子

0

精华

初级会员

Rank: 2

积分
97
金钱
97
注册时间
2013-2-27
在线时间
2 小时
发表于 2013-3-7 13:47:10 | 显示全部楼层
没想到 我是第 4个回复的  正是需要  上午发了邮件给你要程序,没想到已经发上来了   谢谢
回复 支持 反对

使用道具 举报

105

主题

522

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1386
金钱
1386
注册时间
2012-10-23
在线时间
97 小时
发表于 2013-3-8 05:51:43 | 显示全部楼层
超时处理,也正需要用到。
回复 支持 反对

使用道具 举报

53

主题

324

帖子

0

精华

高级会员

Rank: 4

积分
598
金钱
598
注册时间
2012-6-18
在线时间
7 小时
发表于 2013-3-8 08:30:29 | 显示全部楼层
最近做的GPRS和GPS判断特定字符很麻烦 后来也是做了定时器方式
回复 支持 反对

使用道具 举报

53

主题

324

帖子

0

精华

高级会员

Rank: 4

积分
598
金钱
598
注册时间
2012-6-18
在线时间
7 小时
发表于 2013-3-8 08:31:39 | 显示全部楼层
回复【9楼】celticzy:
---------------------------------
回复 支持 反对

使用道具 举报

36

主题

1263

帖子

1

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1612
金钱
1612
注册时间
2012-6-15
在线时间
39 小时
发表于 2013-3-8 10:02:17 | 显示全部楼层
在串口通信过程中 超时处理几乎是必须的。

如果用过Modbus协议,它的判断结束的唯一条件就是超时
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
22
金钱
22
注册时间
2013-3-14
在线时间
0 小时
发表于 2013-3-14 15:15:00 | 显示全部楼层
楼主,小弟我太佩服你了!这才叫写程序~
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
22
金钱
22
注册时间
2013-3-14
在线时间
0 小时
发表于 2013-3-14 15:20:00 | 显示全部楼层
楼主老大,你的框架设计的很好,想拜你为师
回复 支持 反对

使用道具 举报

36

主题

1263

帖子

1

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1612
金钱
1612
注册时间
2012-6-15
在线时间
39 小时
发表于 2013-3-14 16:41:42 | 显示全部楼层
本人应用的部分代码 共享下: 


//检测超时函数 供定时器中断调用-1ms一次
// t为超时时间
__inline void Chk_TimeOut(u8 t)
{
if(!uartRMsg.rcOK && (uartRMsg.rcIndex>=8) && (++uartRMsg.rcS >=t) ) //超时之后,开始重新解码
uartRMsg.rcOK = true;
}
//接收函数, 供USART中断调用
__inline void Recieve_MSG(char ch)
{
uartRMsg.rcS = 0;    //如果接收到数据,则清除超市检测计数,
if(!uartRMsg.rcOK)
{
uartRMsg.Buf.buf[uartRMsg.rcIndex ++] = ch;     //赋值
if(uartRMsg.rcIndex>=8 && uartRMsg.Buf.msg.cmd!=16)//其他条件成立的时候也可进入解码程序<此程序为Modbus应用,可改为接收到结束符等>
uartRMsg.rcOK = true;
}
}

//供主函数调用
void MSGTransfer(void)
{
     if(!uartRMsg.rcOK) return;
        //......数据解析部分
}



回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165516
金钱
165516
注册时间
2010-12-1
在线时间
2116 小时
发表于 2013-3-14 22:45:58 | 显示全部楼层
cool
回复 支持 反对

使用道具 举报

1

主题

6

帖子

0

精华

新手上路

积分
30
金钱
30
注册时间
2013-4-11
在线时间
0 小时
发表于 2014-3-31 16:30:28 | 显示全部楼层
回复【楼主位】celticzy:
---------------------------------
学习
回复 支持 反对

使用道具 举报

3

主题

10

帖子

0

精华

新手上路

积分
42
金钱
42
注册时间
2013-9-28
在线时间
0 小时
发表于 2014-4-28 10:15:55 | 显示全部楼层
楼主厉害!!!
回复 支持 反对

使用道具 举报

10

主题

81

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1502
金钱
1502
注册时间
2013-8-28
在线时间
28 小时
发表于 2014-6-13 09:50:44 | 显示全部楼层
回复【9楼】celticzy:
---------------------------------
非常好 学习了 谢谢
STM32软硬件相关项目外包开发 QQ:83029775
回复 支持 反对

使用道具 举报

23

主题

51

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
216
金钱
216
注册时间
2014-3-22
在线时间
26 小时
发表于 2014-8-2 19:24:49 | 显示全部楼层
楼主我想问一下,用软件定时器有什么好处?再就是这个地方用用硬件定时器可以不?
回复 支持 反对

使用道具 举报

头像被屏蔽

2

主题

164

帖子

1

精华

禁止访问

积分
1316
金钱
1316
注册时间
2012-5-13
在线时间
127 小时
发表于 2014-8-3 10:25:42 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

20

主题

63

帖子

0

精华

初级会员

Rank: 2

积分
163
金钱
163
注册时间
2011-2-28
在线时间
0 小时
发表于 2014-8-25 17:31:46 | 显示全部楼层
回复【10楼】正点原子:
---------------------------------
发出来了么?原子哥
深蓝嵌入式工作室
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165516
金钱
165516
注册时间
2010-12-1
在线时间
2116 小时
发表于 2014-8-25 23:32:50 | 显示全部楼层
回复【26楼】bluesky_kun:
---------------------------------
早就有了
搜索模块资料.
我们的模块很多都是用自定义printf的
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

20

主题

63

帖子

0

精华

初级会员

Rank: 2

积分
163
金钱
163
注册时间
2011-2-28
在线时间
0 小时
发表于 2014-9-2 16:35:49 | 显示全部楼层
回复【27楼】正点原子:
---------------------------------
回复【27楼】正点原子:
---------------------------------
原子哥,我说的是超时处理哦
深蓝嵌入式工作室
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165516
金钱
165516
注册时间
2010-12-1
在线时间
2116 小时
发表于 2014-9-2 23:55:25 | 显示全部楼层
回复【28楼】bluesky_kun:
---------------------------------
也有,我们的蓝牙模块例程,gps模块例程,gsm模块例程等使用的串口2,都是采用超时法。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

13

主题

57

帖子

0

精华

初级会员

Rank: 2

积分
193
金钱
193
注册时间
2014-9-11
在线时间
15 小时
发表于 2015-5-26 09:54:22 | 显示全部楼层
mark一下,回头看看
回复 支持 反对

使用道具 举报

9

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
85
金钱
85
注册时间
2014-6-3
在线时间
2 小时
发表于 2015-8-10 22:01:13 | 显示全部楼层
楼主大牛  下载了好好学学
回复 支持 反对

使用道具 举报

5

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
54
金钱
54
注册时间
2015-5-19
在线时间
0 小时
发表于 2015-8-15 19:47:02 | 显示全部楼层
回复【19楼】aleda303:
---------------------------------
你好我问个基础问题,你的代码中这一句:
if(!uartRMsg.rcOK && (uartRMsg.rcIndex>=8) && (++uartRMsg.rcS >=t) ) //超时之后,开始重新解码
当(!uartRMsg.rcOK)为假时,或者(uartRMsg.rcIndex>=8)为假时,后面的(++uartRMsg.rcS >=t)不会进行判断,但是 ++uartRMsg.rcS 会不会执行呢?
回复 支持 反对

使用道具 举报

36

主题

1263

帖子

1

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1612
金钱
1612
注册时间
2012-6-15
在线时间
39 小时
发表于 2015-8-18 09:41:54 | 显示全部楼层
回复【32楼】我是哈哈:
---------------------------------
这个时候 就不需要它执行了。
条件一成立,主函数根据rcOK标志 开始解析 ,后面就不执行了 
解析完,rcOK =false; rcS=0 ;  重新开始
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手上路

积分
22
金钱
22
注册时间
2015-10-25
在线时间
0 小时
发表于 2015-10-25 22:21:44 | 显示全部楼层
很好,很实用,比那些其他教课书上的通信程序要实用,不死机,不死等。good!谢谢分享!
回复 支持 反对

使用道具 举报

0

主题

0

帖子

0

精华

新手入门

积分
20
金钱
20
注册时间
2015-5-26
在线时间
0 小时
发表于 2016-3-27 09:53:40 | 显示全部楼层
很好,很有用
愿时间成为你我之间的过客
回复 支持 反对

使用道具 举报

0

主题

0

帖子

0

精华

新手入门

积分
20
金钱
20
注册时间
2015-5-26
在线时间
0 小时
发表于 2016-3-27 11:05:10 | 显示全部楼层
  *     @arg USART_IT_RXNE: Receive Data register not empty interrupt
  *     @arg USART_IT_IDLE: Idle line detection interrupt
  *     @arg USART_IT_ORE:  OverRun Error interrupt
  *     @arg USART_IT_NE:   Noise Error interrupt
  *     @arg USART_IT_FE:   Framing Error interrupt
  *     @arg USART_IT_PE:   Parity Error interrupt

超时可不可以这么理解,就是在接收一帧数据时可能是由于以上原因没有完整的接收或已经接收完一帧数据,超时时间范围内没有接收到下一个字节数据,于是就将接收缓冲区的数据转移到准备缓冲区,再对准备缓冲区的数据进行解析,比如帧头帧尾特定字节判断,如果和用户定义的字节不一致,就将这一帧数据丢弃,重新开始接收下一帧
不知道我的理解有没有问题,欢迎指正


愿时间成为你我之间的过客
回复 支持 反对

使用道具 举报

74

主题

334

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
436
金钱
436
注册时间
2015-5-28
在线时间
144 小时
发表于 2016-8-1 21:51:27 | 显示全部楼层
MARK,貌似要用到
最近爱上了stm32
回复 支持 反对

使用道具 举报

15

主题

406

帖子

0

精华

高级会员

Rank: 4

积分
795
金钱
795
注册时间
2015-3-26
在线时间
151 小时
发表于 2016-8-2 10:07:22 | 显示全部楼层
我一直使用一个硬件定时器去判断帧是否结束的,,借鉴了modbus的原理 ,,因为帧长度不知,结束符可能会被帧里面的数据干扰,,所以先是整一帧收下来,,再去解析,,而且这些全在中断里完成,亲测51 msp430  stm32 f0 f1 都完美运行  
回复 支持 反对

使用道具 举报

15

主题

406

帖子

0

精华

高级会员

Rank: 4

积分
795
金钱
795
注册时间
2015-3-26
在线时间
151 小时
发表于 2016-8-2 10:09:20 | 显示全部楼层
骑猪兜风66888 发表于 2014-8-2 19:24
楼主我想问一下,用软件定时器有什么好处?再就是这个地方用用硬件定时器可以不?

可以的 ,,在硬件定时器资源丰富的情况下硬件定时器好
回复 支持 反对

使用道具 举报

15

主题

406

帖子

0

精华

高级会员

Rank: 4

积分
795
金钱
795
注册时间
2015-3-26
在线时间
151 小时
发表于 2016-8-2 10:10:10 | 显示全部楼层
aleda303 发表于 2013-3-8 10:02
在串口通信过程中&nbsp;超时处理几乎是必须的。

如果用过Modbus协议,它的判断结束的唯一条件就是超时

实话!
回复 支持 反对

使用道具 举报

2

主题

8

帖子

0

精华

新手上路

积分
44
金钱
44
注册时间
2017-3-31
在线时间
14 小时
发表于 2017-5-24 09:40:08 | 显示全部楼层
楼主 我按你的程序改写的  怎么不能进入超时字节处理函数啊
回复 支持 反对

使用道具 举报

15

主题

406

帖子

0

精华

高级会员

Rank: 4

积分
795
金钱
795
注册时间
2015-3-26
在线时间
151 小时
发表于 2017-5-24 15:53:36 | 显示全部楼层
就像modbus,从来都是用超时去处理帧结束与否
回复 支持 反对

使用道具 举报

2

主题

8

帖子

0

精华

新手上路

积分
44
金钱
44
注册时间
2017-3-31
在线时间
14 小时
发表于 2017-5-25 16:44:16 | 显示全部楼层
xyl210xyl 发表于 2017-5-24 15:53
就像modbus,从来都是用超时去处理帧结束与否

你好  我按楼主的方式设置的软件定时器  但是程序无法进入字节超时函数   请问这是什么原因呢  方便帮我解答下吗 谢谢
回复 支持 反对

使用道具 举报

10

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
134
金钱
134
注册时间
2016-7-25
在线时间
28 小时
发表于 2017-9-19 17:28:47 | 显示全部楼层
MARK   好好研究一下
回复 支持 反对

使用道具 举报

33

主题

215

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2034
金钱
2034
注册时间
2017-12-11
在线时间
454 小时
发表于 2018-1-10 12:10:13 | 显示全部楼层
好东西,收藏先
回复 支持 反对

使用道具 举报

3

主题

10

帖子

0

精华

初级会员

Rank: 2

积分
73
金钱
73
注册时间
2017-8-11
在线时间
14 小时
发表于 2018-3-24 20:10:06 | 显示全部楼层
谢谢楼主分享
回复 支持 反对

使用道具 举报

0

主题

32

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
226
金钱
226
注册时间
2016-9-21
在线时间
63 小时
发表于 2018-3-25 09:16:17 | 显示全部楼层
一直用RTOS的软件定时器来判断··
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手上路

积分
22
金钱
22
注册时间
2019-7-2
在线时间
4 小时
发表于 2019-7-2 17:14:12 | 显示全部楼层
学习!
回复 支持 反对

使用道具 举报

5

主题

23

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
351
金钱
351
注册时间
2016-11-1
在线时间
97 小时
发表于 2021-5-19 10:36:17 | 显示全部楼层
厉害厉害                 
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-23 17:57

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表