OpenEdv-开源电子网

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

串口缓存USART_RX_BUF清零的问题

[复制链接]

48

主题

179

帖子

0

精华

初级会员

Rank: 2

积分
185
金钱
185
注册时间
2017-6-19
在线时间
90 小时
发表于 2020-7-17 10:41:51 | 显示全部楼层 |阅读模式
5金钱
如题,我想要当单片机接收到三个字节的数组,判断第三个字节是否为0X01,假如判断为真,LED闪烁。我用串口调试助手发送{0X12 0X34 0X01}和{0X12 0X34 0X02}结果LED均闪烁,代码如下,求指教~

PS:我这个里面没有对USART_RX_BUF里面的i进行清零的处理,不知道是不是这个问题,如果是的话,应该在什么位置清零呢?
/******************************************************************************************/
  1. u8 i=0;
  2. u8 USART_RX_BUF[USART_REC_LEN];     //接收缓冲,最大USART_REC_LEN个字节 200字节.
  3. void USART1_IRQHandler(void)    //中断服务函数                           
  4.     {
  5.                 if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)  //接收中断
  6.                 {
  7.                         USART_ClearITPendingBit(USART1,USART_IT_RXNE);       //清除标志位
  8.                         USART_RX_BUF[i]=USART_ReceiveData(USART1);      //读取接收到的数据
  9.                         i++;
  10.                 if(USART_RX_BUF[2]==0X01)
  11.                 {       
  12.                         LED0=~LED0;
  13.                         delay_ms(200);       
  14.                         LED0=~LED0;
  15.                 }
  16.                 else{}
  17.                 }
  18.     }
复制代码

最佳答案

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

恩,中断里面加延时确实有问题,UART_RX_BUF还是要清理的,已经修改好了
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

48

主题

179

帖子

0

精华

初级会员

Rank: 2

积分
185
金钱
185
注册时间
2017-6-19
在线时间
90 小时
 楼主| 发表于 2020-7-17 10:41:52 | 显示全部楼层
liaohaijian 发表于 2020-7-17 14:09
你在中断服务函数里面加了延时200ms,肯定有问题啊,中断处理要快,你可以在中断设置个标志位flag,如果 ...

恩,中断里面加延时确实有问题,UART_RX_BUF还是要清理的,已经修改好了

  1. void USART1_IRQHandler(void)    //中断服务函数                           
  2.     {
  3.     int m;
  4.                 if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)  //接收中断
  5.                 {
  6.                         USART_ClearITPendingBit(USART1,USART_IT_RXNE);       //清除标志位
  7.                         USART_RX_BUF[j]=USART_ReceiveData(USART1);      //读取接收到的数据
  8.                         j++;
  9.                         if (j>2)j=0;                       
  10.                 if(USART_RX_BUF[2]==0X01)
  11.                 {       
  12.                         USART_SendData(USART1,USART_RX_BUF[2]);
  13.                         for(  m=0;m<3;m++)
  14.                         {
  15.                                 USART_RX_BUF[m]=0;
  16.                         }
  17.                 }
  18.                 else{}
  19.                 }
  20.     }
  21.        
复制代码
回复

使用道具 举报

48

主题

179

帖子

0

精华

初级会员

Rank: 2

积分
185
金钱
185
注册时间
2017-6-19
在线时间
90 小时
 楼主| 发表于 2020-7-17 14:00:38 | 显示全部楼层
没有人,自己帮顶
回复

使用道具 举报

34

主题

255

帖子

0

精华

高级会员

Rank: 4

积分
912
金钱
912
注册时间
2019-7-5
在线时间
189 小时
发表于 2020-7-17 14:09:07 | 显示全部楼层

你在中断服务函数里面加了延时200ms,肯定有问题啊,中断处理要快,你可以在中断设置个标志位flag,如果收到0x01,即flag=1,收到其他即flag=0,主函数判断flag=1即闪烁,flag即关闭,不用清理UART_RX_BUF
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

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

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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