STM32 UART Rx中断数据接收相关函数

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) {
    if(huart->Instance==DEBUG_UART) {
        if((DEBUG_UART_RX_STA&0x8000)==0) {
            if(DEBUG_UART_RX_STA&0x4000) {
                if(DEBUG_UART_aRxBuffer[0]==0x0A) {
                    DEBUG_UART_RX_BUF[DEBUG_UART_RX_STA&0x3FFF] = '\n';
                    DEBUG_UART_RX_STA++;
                    DEBUG_UART_RX_STA |= 0x8000;
                }
                else DEBUG_UART_RX_STA = 0;
            } else {
                if(DEBUG_UART_aRxBuffer[0]==0x0D) {
                    DEBUG_UART_RX_BUF[DEBUG_UART_RX_STA&0x3FFF] = '\r';
                    DEBUG_UART_RX_STA++;
                    DEBUG_UART_RX_STA |= 0x4000;
                }
                else {
                    DEBUG_UART_RX_BUF[DEBUG_UART_RX_STA&0x3FFF] = DEBUG_UART_aRxBuffer[0];
                    DEBUG_UART_RX_STA++;
                    if(DEBUG_UART_RX_STA>(USART_BUF_SIZE-1))  DEBUG_UART_RX_STA = 0;
                }
            }
        }
    }

DEBUG_UART_RX_STA为u16(unsigned int)类型,存储数值范围0~65535,对应二进制最大值(0b1111 1111 1111 1111),
我们规定DEBUG_UART_RX_STA二进制第一二位为结束符标志位,第一位代表接收到\n,第二位代表接收到\r,当依次接收到\r\n时,代表串口接收完成。
剩余十四位为串口接收字符串长度,去除第一二位,最大值用二进制计数表示为0b0011 1111 1111 1111,即十六进制0x3FFF,通过按位与运算得出接收数据长度,所以长度的计算为 DEBUG_UART_RX_STA&0x3FFFF,DEBUG_UART_RX_STA能记录的最大长度为0x3FFF = 16383。

Last modification:November 12, 2022
如果觉得我的文章对你有用,请随意赞赏