请教串口中断接收误码

发布于 2020-06-29 18:52:34

串口以中断方式接收数据,当波特率为115200时经常会出现字符串缺少个别字符,使用9600时则不会。目前只能确定是串口接收时出的问题,不能确定具体是什么原因

以下是串口程序

int Uart_Init(void)
{
    //UART2 初始化设置
    UART2_Handler.Instance = USART2;                          //USART2
    UART2_Handler.Init.BaudRate = 115200;                    //波特率
    UART2_Handler.Init.WordLength = UART_WORDLENGTH_8B;     //字长为8位数据格式
    UART2_Handler.Init.StopBits = UART_STOPBITS_1;              //一个停止位
    UART2_Handler.Init.Parity = UART_PARITY_NONE;              //无奇偶校验位
    UART2_Handler.Init.HwFlowCtl = UART_HWCONTROL_NONE;     //无硬件流控
    UART2_Handler.Init.Mode = UART_MODE_TX_RX;                  //收发模式
    HAL_UART_Init(&UART2_Handler);                            //HAL_UART_Init()会使能UART2

    HAL_UART_Receive_IT(&UART2_Handler, (uint8 *)RxBuf, 1);
    
    return 0;
}
INIT_BOARD_EXPORT(Uart_Init);

/**
 * @brief    HAL库串口底层初始化,时钟使能,引脚配置,中断配置
 *
 * @param    huart    串口句柄
 *
 * @return  void
 */
void HAL_UART_MspInit(UART_HandleTypeDef *huart)
{
    //GPIO端口设置
    GPIO_InitTypeDef GPIO_Initure;
    

    if(huart->Instance == USART2) 
    {
        __HAL_RCC_GPIOA_CLK_ENABLE();                //使能GPIOA时钟
        __HAL_RCC_USART2_CLK_ENABLE();                //使能USART2时钟

        GPIO_Initure.Pin = GPIO_PIN_2|GPIO_PIN_3;    //PA2 PA3
        GPIO_Initure.Mode = GPIO_MODE_AF_PP;        //复用推挽输出
        GPIO_Initure.Pull = GPIO_PULLUP;            //上拉
        GPIO_Initure.Speed = GPIO_SPEED_FAST;        //高速
        GPIO_Initure.Alternate = GPIO_AF7_USART2;    //复用为USART2
        HAL_GPIO_Init(GPIOA, &GPIO_Initure);           //初始化PA2 PA3
        
        HAL_NVIC_EnableIRQ(USART2_IRQn);            //使能USART2中断通道
        HAL_NVIC_SetPriority(USART2_IRQn, 3, 3);    //抢占优先级3,子优先级3
    }
}

//USART2 Callback
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
    if(huart->Instance == USART2)
    {
        if(USART2_RX_Count < (USART2_RECV_SIZE-1))
        {
            USART2_Recv_Buf[USART2_RX_Count++] = RxBuf[0];
            USART2_RX_Start = 1;
            USART2_RX_Times = 0;
        }
        else USART2_RX_Count=0;
    }
}
//USART2 IRQ
void USART2_IRQHandler(void)
{
    uint32 timeout;

    HAL_UART_IRQHandler(&UART2_Handler);

    timeout=0;
    while(HAL_UART_GetState(&UART2_Handler) != HAL_UART_STATE_READY)
    {
        timeout++;
        if(timeout >= HAL_MAX_DELAY)break;
    }

    timeout=0;
    while(HAL_UART_Receive_IT(&UART2_Handler, (uint8 *)RxBuf, 1) != HAL_OK)
    {
        timeout++;
        if(timeout >= HAL_MAX_DELAY)break;
    }
}

查看更多

关注者
0
被浏览
120
zhangjun
zhangjun 2020-07-01

芯片型号是?hal库里面的函数调用多一点,如果芯片速度太慢也可能出现高速率时出现缺少个别字符的情况。

1 个回答

撰写答案

请登录后再发布答案,点击登录

发布
问题

分享
好友