OpenEdv-开源电子网

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

USmart例程:不额外使用一个Timer,直接在串口的中断处理函数USART1_IRQHandler中调用一个函数来处理USART_RX_BUF

[复制链接]

14

主题

173

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
256
金钱
256
注册时间
2011-10-14
在线时间
2 小时
发表于 2012-7-16 17:03:22 | 显示全部楼层 |阅读模式
USmart处理从PC丢到STM32串口数据的方法:
1. 在串口的中断处理函数USART1_IRQHandler将串口数据填在全局数组USART_RX_BUF中;
2. 另外有一个Tim2在不停检查标志位SART_RX_STA&0x8000,如果表示串口接收完成,处理全局数组USART_RX_BUF;

由于Timer的数量有限,是否可以不使用Timer,直接在串口中断处理函数USART1_IRQHandler中,调用一个函数Parse_Rx_Buf来处理USART_RX_BUF?
本人实验下来的结果是:大多数情况下没有问题。但是偶尔会出现USART_RX_BUF里收到的数据不完整。
请教各位的看法。




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

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2012-7-16 17:36:33 | 显示全部楼层
你判断串口结束输入的条件是什么?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

14

主题

173

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
256
金钱
256
注册时间
2011-10-14
在线时间
2 小时
 楼主| 发表于 2012-7-16 21:58:45 | 显示全部楼层

回复【2楼】正点原子:
---------------------------------
原子哥,用的你USART.c中USART1_IRQHandler的代码啊,接收到0x0d0a啊。
dbg_parse_string((char*)USART_RX_BUF, len)这个是我调用的一个全局函数

void USART1_IRQHandler(void)
{
u8 res;
u8 len;     
u8 strTmp[128];
if(USART1->SR&(1<<5))//接收到数据
{  
res=USART1->DR; 
if((USART_RX_STA&0x8000)==0)//接收未完成
{
if(USART_RX_STA&0x4000)//接收到了0x0d
{
if(res!=0x0a)
USART_RX_STA=0;//接收错误,重新开始
else 
{
USART_RX_STA|=0x8000; //接收完成了
len=USART_RX_STA&0x3f;
USART_RX_BUF[len]='\0';  

OS_ENTER_CRITICAL();
dbg_parse_string((char*)USART_RX_BUF, len);
OS_EXIT_CRITICAL();

USART_RX_STA=0;

}
}else //还没收到0X0D
{
if(res==0x0d)USART_RX_STA|=0x4000;
else
{
USART_RX_BUF[USART_RX_STA&0X3F]=res;
USART_RX_STA++;
if(USART_RX_STA>63)USART_RX_STA=0;//接收数据错误,重新开始接收   
}  
}
}          
}    
回复 支持 反对

使用道具 举报

14

主题

173

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
256
金钱
256
注册时间
2011-10-14
在线时间
2 小时
 楼主| 发表于 2012-7-16 22:05:08 | 显示全部楼层


图片清楚点,红色框里是我调用的函数

回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2012-7-16 22:35:06 | 显示全部楼层
 这样,应该排除是否在接收过程中产生了错误.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

14

主题

173

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
256
金钱
256
注册时间
2011-10-14
在线时间
2 小时
 楼主| 发表于 2012-7-17 09:33:00 | 显示全部楼层
l逻辑上应该没什么问题,我比较担心是不是有时序的问题。

因为这个问题不是每次都发生,只是偶尔出现接收数据不完全~

回复 支持 反对

使用道具 举报

14

主题

173

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
256
金钱
256
注册时间
2011-10-14
在线时间
2 小时
 楼主| 发表于 2012-7-17 14:00:27 | 显示全部楼层
中午跟老鸟讨论:中断处理函数里做的事情不宜太多。否则,如果这次中断处理没完成,函数体没返回,下次中断过来时,就不会进中断处理函数,也就是说,中断可能被丢掉了。
回到USART1_IRQHandler,也就是说:res=USART1->DR; 这个数据可能就被丢掉了。

这样看来,如果没有多线程,就必须花费一个Timer来处理USART_RX_BUF了。

原子,当初设计USmart的时候,是不是考虑到这点啊?
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2012-7-17 21:02:16 | 显示全部楼层
我考虑的是接收发送有一个简单的结束判断方法.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

14

主题

173

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
256
金钱
256
注册时间
2011-10-14
在线时间
2 小时
 楼主| 发表于 2012-7-18 08:51:17 | 显示全部楼层

回复【8楼】正点原子:
我考虑的是接收发送有一个简单的结束判断方法.
---------------------------------

原子哥,你在设计的时候为什么会使用一个Timer来处理USART_RX_BUF,而不是直接在中断处理函数USART1_IRQHandler来处理?
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2012-7-18 09:06:45 | 显示全部楼层
在串口接收里面,除非加入特定的字符告知结束(比如回车符),否则不好控制.
用定时器就可以控制时间了.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

14

主题

173

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
256
金钱
256
注册时间
2011-10-14
在线时间
2 小时
 楼主| 发表于 2012-7-18 10:21:07 | 显示全部楼层
在串口接收里面,除非加入特定的字符告知结束(比如回车符),否则不好控制. 
******
在串口接收里面,确实是用回车符0x0a0d来标识,然后标识USART_RX_STA|=0x8000
在定时器调用的Scan函数里,也是通过检查USART_RX_STA&0x8000来确定结束的
所以我认为在串口接收里面和定时器里,判定串口结束的时间点是一样的。

“否则不好控制”,这个指什么意思啊?

用定时器就可以控制时间了.
******
“用定时器控制时间”是指?
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2012-7-18 11:56:53 | 显示全部楼层
回复【11楼】smithlin:
---------------------------------
定时器判断串口空闲时间,从而在接收完一次数据之后,调用usmart的处理机制.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

10

主题

68

帖子

0

精华

初级会员

Rank: 2

积分
141
金钱
141
注册时间
2013-5-6
在线时间
3 小时
发表于 2014-6-11 09:54:51 | 显示全部楼层
EXTI0_IRQHandler 中断服务函数 在固件库里查不到呢?
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-6-11 20:44:55 | 显示全部楼层
回复【13楼】吴月涛:
---------------------------------
在stm32f10x_it.c,或者要你自己实现.比如寄存器版本代码.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

10

主题

68

帖子

0

精华

初级会员

Rank: 2

积分
141
金钱
141
注册时间
2013-5-6
在线时间
3 小时
发表于 2014-6-12 08:34:41 | 显示全部楼层
if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)   中的“!= RESET ”可用“!= 0 ”替代吗?
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-6-12 23:14:42 | 显示全部楼层
回复【15楼】吴月涛:
---------------------------------
你能自己试试么?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

10

主题

68

帖子

0

精华

初级会员

Rank: 2

积分
141
金钱
141
注册时间
2013-5-6
在线时间
3 小时
发表于 2014-6-13 09:14:42 | 显示全部楼层
可不可以用定时器TIM3的1、2、3和4通道产生同频、同相但脉宽不同的四路PWM呢?
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-6-13 23:21:16 | 显示全部楼层
回复【17楼】吴月涛:
---------------------------------
可以
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

10

主题

68

帖子

0

精华

初级会员

Rank: 2

积分
141
金钱
141
注册时间
2013-5-6
在线时间
3 小时
发表于 2014-6-16 15:29:23 | 显示全部楼层
谢谢原子老师
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
25
金钱
25
注册时间
2015-1-5
在线时间
1 小时
发表于 2016-3-15 18:06:00 | 显示全部楼层
正点原子 发表于 2012-7-18 09:06
在串口接收里面,除非加入特定的字符告知结束(比如回车符),否则不好控制.
用定时器就可以控制时间了.

QQ截图20160315180356.jpg
原子哥,如上图,我不想让客户在串口工具里输入数据完了还要加回车,所以一检测到有数据就进中断,这样做理论上可以不?
实际操作,串口发个1234567890   另一端只能收到149或者148或者159...感觉中间被漏掉了好多数据,难道是串口太慢了的缘故??
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
25
金钱
25
注册时间
2015-1-5
在线时间
1 小时
发表于 2016-3-16 21:05:46 | 显示全部楼层
My_Skity 发表于 2016-3-15 18:06
原子哥,如上图,我不想让客户在串口工具里输入数据完了还要加回车,所以一检测到有数据就进中断,这样 ...

在操作过程中发现按照原子哥原来的串口中断程序,接收数据时会有小bug,在搜索的时候发现原子哥已经指出了这个bug,并做了改进,非常简洁!!http://www.openedv.com/posts/list/26242.htm
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-19 23:51

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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