OpenEdv-开源电子网

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

串口利用定时中断接收不定长度的数据

[复制链接]

3

主题

11

帖子

0

精华

新手上路

积分
43
金钱
43
注册时间
2013-9-1
在线时间
0 小时
发表于 2013-9-2 21:25:54 | 显示全部楼层 |阅读模式

void USART1_IRQHandler(void)
{
  if (USART1->SR&(1<<5))
  {
 rdatabuf[rdatanum]= USART1->DR;
 rdatanum++;
  Timerx_Init(500,2399);//其实这里我是想让定时器的计数器清0,但是不知道怎么写
  }
}

void TIM3_IRQHandler(void)
{                 
 if(TIM3->SR&0X0001)//溢出中断
 {
    r_sec= 1;       //超时标志位                        
 }     
 TIM3->SR&=~(1<<0);//清除中断标志位     
}



void Timerx_Init(u16 arr,u16 psc)
{
 TIM3->SMCR&=0xFFFFF8;  //内部时钟
 RCC->APB1ENR|=1<<1;  //TIM3时钟使能   
  TIM3->ARR=arr;   
 TIM3->SC=psc; 
 TIM3->DIER|=1<<0;   //允许更新中断       
 TIM3->CR1|=0x01;    //使能定时器3
   MY_NVIC_Init(3,3,TIM3_IRQChannel,2);//抢占1,子优先级2,组2         
}

这样串口接收到的数据总是有漏掉,请高手指教


 


 


 

 

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

使用道具 举报

9

主题

1385

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
12133
金钱
12133
注册时间
2013-3-8
在线时间
1289 小时
发表于 2013-9-2 21:54:43 | 显示全部楼层
回复【楼主位】zyjs:
---------------------------------
不要用定时器中断,只要一个好的通讯协议就可以实现不定长度数据的发送与接收!
比如每次发送数据前两个字节为定值,如 5A A5  
第三个字节为命令字,如A3 表示命令A3,
第四个字节为要发送的数据长度,如04,表示4个字节数据
数据(如 01 02 03 04)后,再跟一个字节结束符,如0XC0
最后一个字节为校验

整串数据如下
5A A5   A3   04   01 02 03 04    C0   校验

改变数据长度,就可以改变整个发送数据长度。
回复 支持 反对

使用道具 举报

3

主题

11

帖子

0

精华

新手上路

积分
43
金钱
43
注册时间
2013-9-1
在线时间
0 小时
 楼主| 发表于 2013-9-2 22:49:18 | 显示全部楼层
希望用定时中断做,那样不受协议限制
回复 支持 反对

使用道具 举报

3

主题

11

帖子

0

精华

新手上路

积分
43
金钱
43
注册时间
2013-9-1
在线时间
0 小时
 楼主| 发表于 2013-9-3 11:33:48 | 显示全部楼层
有谁能够帮忙看看阿!感激不尽!
回复 支持 反对

使用道具 举报

25

主题

683

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1351
金钱
1351
注册时间
2012-4-25
在线时间
195 小时
发表于 2013-9-3 12:00:05 | 显示全部楼层
定时器 超时机制,就定个变量就行了。串口接收到数据就 ++,定时器就 --; 当定时器判断 些数据加到一定时候 就表示串口中断完了
1-1
回复 支持 反对

使用道具 举报

3

主题

11

帖子

0

精华

新手上路

积分
43
金钱
43
注册时间
2013-9-1
在线时间
0 小时
 楼主| 发表于 2013-9-3 12:00:23 | 显示全部楼层
后来参考了ATK-HC05蓝牙串口模块资料,修改了一下程序,现在串口只能收到一次中断(就是一个数据了),真心找不出原因阿!
void USART1_IRQHandler(void)
{
    if (USART->SR&(1<<5))
    {
        rdatabuf[rdatanum++]=USART->DR;
        if(rdatanum<1000)
        {
           TIM3-〉CNT=0;
        if(rsec==0)
         {
               Timer3_set(1);
             } 
         }
    else
       {
          rsec=1;
       }
     }
}



void TIM3_IRQHandler(void)
{
     if(TIM3->SR&0X01)
     {
         rsec=1;
         TIM->SR&=~(1<<0);
          Timer3_set(0);

      }
}

求大神指导!
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-9-3 15:38:32 | 显示全部楼层
rsec没有清零吧...
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

3

主题

11

帖子

0

精华

新手上路

积分
43
金钱
43
注册时间
2013-9-1
在线时间
0 小时
 楼主| 发表于 2013-9-3 20:46:01 | 显示全部楼层
resc只有在超时或者串口长度超过1000的时候才能被置1吗?resc的初始值为0,当接收完成后,在主程序中将resc置为0 了
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-9-3 21:45:32 | 显示全部楼层
你在这里设置个断点:  rdatabuf[rdatanum++]=USART->DR; 
然后跟踪,看看第一次以后,还有没有进入这个?
如果有进入,就说明是收到数据了,只是你的处理有问题。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

28

主题

109

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
223
金钱
223
注册时间
2013-4-14
在线时间
24 小时
发表于 2015-9-7 11:19:04 | 显示全部楼层
请问楼主,你最后这么解决的呢?
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-21 19:18

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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