OpenEdv-开源电子网

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

串口中断缓存,缓存输错!求解!

[复制链接]

7

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
76
金钱
76
注册时间
2014-7-24
在线时间
1 小时
发表于 2015-4-18 10:58:39 | 显示全部楼层 |阅读模式
5金钱
1. 我手里有款激光传感器,需要STM32接收传感器数据。通过STM32给传感器发送指定命令后,激光传感器返回数据协议如下:
    起始帧以十六进制:0XA5,0X5A,0X05,0X00,0X00,0X40,0X81共7个字节作为数据其实判断。之后不断传回5个字节一个数据包的有用信息。
        2.为此,我通过串口2给传感器发送命令,并通过串口2中断接收传感器数据,并通过串口1与电脑通讯以判断数据正确性。首先采用串口2收一次就立即发送给串口1方式,在串口调试助手里能有效显示数据信息,代码和接受如下所示:
                                               /*main函数如下所示*/
int main(void)
 {
SystemInit();
delay_init(72);    
uart_init(115200);
NVIC_Configuration();
while(1)
{
RpCmd(RPLIDAR_CMD_FORCE_SCAN);//发送命令
delay_ms(1000); 
    for(m;m<128;m++)
    {printf("Buf[%d",m);
     printf("]=%02hhx\n",USART2_RX_BUF[m]);
  }
                                               /***串口2中断函数如下:***/
void USART2_IRQHandler(void) {       
if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)  //????????
{
  USART_ClearITPendingBit(USART2,USART_IT_RXNE);
Res2 =USART_ReceiveData(USART2);//
USART_SendData(USART1,Res2);
while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET){}
}
最终能正确输出结果:








最佳答案

查看完整内容[请看2#楼]

回复【3楼】正点原子: --------------------------------- 问题已解决!中断函数的printf占用太多时间,舍去即可!非常感谢原子哥!
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

7

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
76
金钱
76
注册时间
2014-7-24
在线时间
1 小时
 楼主| 发表于 2015-4-18 10:58:40 | 显示全部楼层
回复【3楼】正点原子:
---------------------------------
问题已解决!中断函数的printf占用太多时间,舍去即可!非常感谢原子哥!
回复

使用道具 举报

7

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
76
金钱
76
注册时间
2014-7-24
在线时间
1 小时
 楼主| 发表于 2015-4-18 11:25:40 | 显示全部楼层
续上

3.但是当我计划采用缓存接收时,却出现问题了,我是这么想的:定义一个接受标识符USART2_RX_STA,其最高位作为接收完成标志符,剩下7位用于计数,因此功能计数128个,用数组USART2_RX_BUF[128]缓存数据。并在中断函数中显示每次中断接收的数据,以及在main函数中for显示接收到的数组成员,如下所示:
 
                                                /***中断接收函数***/
void USART2_IRQHandler(void)  {
if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET) 
{
  USART_ClearITPendingBit(USART2,USART_IT_RXNE);
Res2 =USART_ReceiveData(USART2);//(USART2->DR); 
   if((USART2_RX_STA&0x80)==0) //缓存接收
{
USART2_RX_BUF[USART2_RX_STA&0x7F]=Res2;
printf("^^%d^^",USART2_RX_BUF[USART2_RX_STA]);
++USART2_RX_STA;
if(USART2_RX_STA==127) 
USART2_RX_STA|=0x80;
else USART2_RX_STA&=0x7F;
}
}

但是现在问题来了:在起始帧中,判断需要的7个字节只能正确显示头2个字节0XA5和0X5A。请问只是什么原因?如下图,请教各位高手解答,非常感谢:


回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-4-18 23:02:20 | 显示全部楼层
帮顶。。。。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

13

主题

43

帖子

0

精华

初级会员

Rank: 2

积分
119
金钱
119
注册时间
2014-10-19
在线时间
2 小时
发表于 2015-4-19 22:44:39 | 显示全部楼层
回复【4楼】coolzhangone:
---------------------------------
兄弟 能把您的这份程序发给我参考一下吗 我现在也需要通过串口发送指令 但不知道怎么写程序 谢啦 邮箱 wenwu1109@126.com
回复

使用道具 举报

13

主题

43

帖子

0

精华

初级会员

Rank: 2

积分
119
金钱
119
注册时间
2014-10-19
在线时间
2 小时
发表于 2015-4-19 22:44:57 | 显示全部楼层
邮箱 wenwu1109@126.com
回复

使用道具 举报

1

主题

8

帖子

0

精华

初级会员

Rank: 2

积分
54
金钱
54
注册时间
2016-8-19
在线时间
12 小时
发表于 2016-8-23 10:18:01 | 显示全部楼层
我这串口2的配置老是不行,同学能把你的程序给我参考一下吗?邮箱1353109771@qq.com,万分感谢
回复

使用道具 举报

5

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
80
金钱
80
注册时间
2017-10-18
在线时间
14 小时
发表于 2017-10-19 00:07:45 | 显示全部楼层
各位大神,谁有程序发我一份1056062762@qq.com
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-9 04:16

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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