你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

串口中断数据主函数调用

[复制链接]
闪烁 提问时间:2022-10-14 14:58 / 已解决
u8 USART_RX_BUF[9];//定义接收数组,看传感器返回的有多少字节数据
u8 USART_RX_STA=0;//数组标志位,如第0位、第一位
static char  start=0;  //开始接收数据标志位

void USART1_IRQHandler(void)
{
  u8 Res=0;//定义一个数来接收每次读取的数据
   if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)  //接收中断,每一个字节都会中断一次
    {
        Res =USART_ReceiveData(USART1);        //读取接收到的字节数据
        //接收数据时不要随便加入占用时间的命令,如串口打印,会影响下面数据字节的接收

                        if(Res == 0x40) //如果接收的第一位数据是0XFF(这个是查看传感器的手册得知的,这里相当于进行校验)
            {
                 start=1;   //开始接收数据标志位,一旦第一个接收正确,就就继续向下接收
            }

            if(start== 1)
            {
                USART_RX_BUF[USART_RX_STA] = Res ; //把接收到的数据存到数组里面               
                USART_RX_STA++;//数组标志位加1
                if(USART_RX_STA >= 9 && (USART_RX_BUF[1]==0x41))//这里还校验了接收的第二个数据
                    {
                        printf("PM2.5:%c\n",USART_RX_BUF[4]);//通过串口1打印接收数组里的数据
                        USART_RX_STA=0;//重新开始接收   
                        USART_RX_BUF[0] = 0;
                                            start=0;
                    }
            }
     while (USART_GetFlagStatus(USART1,USART_FLAG_TXE) == RESET);
                }
         if(USART_GetFlagStatus(USART1,USART_FLAG_ORE) == SET)
         {
                 USART_ClearFlag(USART1,USART_FLAG_ORE);
         }
}               


定义的接收数组u8 USART_RX_BUF[9];,如何在主循环直接调用
while(1)
        {
        printf("PM2.5:%c\n",USART_RX_BUF[4]);
        delay_ms(10000);           
        }

收藏 评论3 发布时间:2022-10-14 14:58

举报

3个回答
闪烁 回答时间:2022-10-14 16:03:54
原来变量在调用的文件那里加extern
yklstudent 回答时间:2022-10-14 21:37:32
这个代码写的,如果发送的第二帧数据不是0x41,不是要一直接收数据缓存到USART_RX_BUF数组,然后超过USART_RX_BUF数组溢出,导致程序跑飞
废鱼 回答时间:2022-10-15 09:22:36
中断中尽量不要增加太多的处理,数据接收放入到缓冲区,外部处理最好。要不然会影响中断的时间。而且也不要在中断中加打印,除非特殊情况,比如调试的时候,或者加的是错误中断中。
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版