[应用相关] 关于串口中断!个人理解与网络搜索的信息

[复制链接]
829|7
 楼主| goodluck09876 发表于 2019-7-20 09:13 | 显示全部楼层 |阅读模式
最近看到有关串口中断引发的问题,个人把自己一直使用的串口解析上传一下:

    if (USART_GetFlagStatus(QX5_USARTx, USART_FLAG_PE) != RESET)
    {
        USART_ReceiveData(QX5_USARTx);
        USART_ClearFlag(QX5_USARTx, USART_FLAG_PE);
    }

    if (USART_GetFlagStatus(QX5_USARTx, USART_FLAG_ORE) != RESET)
    {
        USART_ReceiveData(QX5_USARTx);
        USART_ClearFlag(QX5_USARTx, USART_FLAG_ORE);
    }

    if (USART_GetFlagStatus(QX5_USARTx, USART_FLAG_FE) != RESET)
    {
        USART_ReceiveData(QX5_USARTx);
        USART_ClearFlag(QX5_USARTx, USART_FLAG_FE);
    }
       
    if(USART_GetITStatus(QX5_USARTx,USART_IT_RXNE)!=RESET)
    {

        //数据缓冲转换
        if(UART2_Flag.Buf_Now==Buf_A) //现在用的是Buf_A,则使用Buf_B
        {
            UART2_Flag.USER_USART_RX_Buf_A[UART2_Flag.Num_Rx] = USART_ReceiveData(QX5_USARTx);
            UART2_Flag.Num_Rx++;
        }
        else    //现在用的是Buf_B,则使用Buf_A
        {
            UART2_Flag.USER_USART_RX_Buf_B[UART2_Flag.Num_Rx] = USART_ReceiveData(QX5_USARTx);
            UART2_Flag.Num_Rx++;
        }
    }

    if(USART_GetITStatus(QX5_USARTx,USART_IT_IDLE)!=RESET)
    {

        Uart_stateus = QX5_USARTx->SR;
        Uart_stateus = QX5_USARTx->DR; //清除串口空闲接受中断

        if(UART2_Flag.Buf_Now==Buf_A) //现在用的是Buf_A,则使用Buf_B
        {
            UART2_Flag.Buf_Now=Buf_B;
            /////////////////////////////////////
                        //2019年7月11日;加入;
            memcpy(UART2_Flag.USER_USART_RX_Buf_B, Empty_Flag.Null, 255);
            /////////////////////////////////////
        }
        else
        {
            UART2_Flag.Buf_Now=Buf_A;
            /////////////////////////////////////
                        //2019年7月11日;加入;
            memcpy(UART2_Flag.USER_USART_RX_Buf_A, Empty_Flag.Null, 255);
            /////////////////////////////////////
        }
        UART2_Flag.IDLE_FLAG=SET;
    }
}


 楼主| goodluck09876 发表于 2019-7-20 09:13 | 显示全部楼层
    if (USART_GetFlagStatus(QX5_USARTx, USART_FLAG_PE) != RESET)
    {
        USART_ReceiveData(QX5_USARTx);
        USART_ClearFlag(QX5_USARTx, USART_FLAG_PE);
    }
这里是增加的第一个中断判断
 楼主| goodluck09876 发表于 2019-7-20 09:14 | 显示全部楼层

    if (USART_GetFlagStatus(QX5_USARTx, USART_FLAG_ORE) != RESET)
    {
        USART_ReceiveData(QX5_USARTx);
        USART_ClearFlag(QX5_USARTx, USART_FLAG_ORE);
    }

这里是增加的第二个中断判断
 楼主| goodluck09876 发表于 2019-7-20 09:14 | 显示全部楼层
  if (USART_GetFlagStatus(QX5_USARTx, USART_FLAG_FE) != RESET)
    {
        USART_ReceiveData(QX5_USARTx);
        USART_ClearFlag(QX5_USARTx, USART_FLAG_FE);
    }

这里是增加的第三个中断判断
 楼主| goodluck09876 发表于 2019-7-20 09:37 | 显示全部楼层
前几天 看大家遇到了这样的情况,串口引发的种种问题。这样处理一下,应该是可以解决。
wakayi 发表于 2019-8-9 12:13 | 显示全部楼层
非常感谢楼主分享
wowu 发表于 2019-8-9 12:48 | 显示全部楼层
非常感谢楼主分享
xiaoqizi 发表于 2019-8-9 12:52 | 显示全部楼层
非常感谢楼主分享
您需要登录后才可以回帖 登录 | 注册

本版积分规则

220

主题

5843

帖子

25

粉丝
快速回复 在线客服 返回列表 返回顶部