\r\n结尾的UART协议

串口协议\r\n结尾


初步实现功能使用串口发送数据,通过队列发送给SPI,然后用逻辑分析仪抓取一下spi波形,跟串口发送数据是否一致。

做这个项目发现自己对于串口协议不是太熟悉,因为之前学校学习使用的正点原子一直都是用那个串口协议,简单了解一下程序没有太看懂,也没有深入了解。如今用到了就是自己实现了一下,发现最后结尾有一个\r混进去了,不过是意料之中,但是没有找到合适的办法,就去借鉴一下之前学习stm32时候正点原子写的代码。

【小贴士】在介绍之前首先了解回车和换行的表示方法和区别:

回车:回到当前行行首,不会回到下一行,如果接着输入则会覆盖本行以前的内容。

换行:换到当前位置的下一行,而不会回到首行。

回车 换行
ox0d 0x0a
\r \n

参考正点原子串口例程

\r\n结尾的UART协议

#define UART_BAUDRATE 115200
#define UART_RX_SIZE 256
char rx_buff[UART_RX_SIZE];
uint16_t USART_RX_STA=0;//0000 0000 0000 0000门道在这

void uart_test_poll(uint8_t port)
{
    int val;
    bool_t err;
    while (1)
    {
        os_delay(10);
        val=iot_uart_rx(port);
        if (val<0)
        {
            continue;
        }

        if((USART_RX_STA&0x8000)==0)//判断最高位置
        {
            if(USART_RX_STA&0x4000)//0x0d(\r)如果接收到
            {
                if(val!=0x0a)//0x0a(\n)如果没有接收到,接收失败重新接收
                    USART_RX_STA=0;
                else
                    USART_RX_STA|=0x8000;	//最高位置1
            }
            else
            {
                if(val==0x0d)	//如果接收到0x0d(\r) 就把USART_RX_STA次高位置1
                    USART_RX_STA|=0x4000;//	次高位置1
                else//没接收到就把数据给buff,判断如果大于buff容量就停止接收
                {
                    rx_buff[USART_RX_STA&0x3fff]=(char)val;
                    USART_RX_STA++;
                    if(USART_RX_STA>(UART_RX_SIZE-1))
                        USART_RX_STA=0;
                }
            }
        }

        if(USART_RX_STA&0x8000)//如果最高位是1
        {
            iot_printf("rx_buff:%s",rx_buff);
            iot_printf("UART_TX SIZE:%d,Task send:%d\r\n",UART_RX_SIZE,UART_SIZE);
            if(uart_qeue!=NULL)
            {
                err=os_queue_send(uart_qeue,rx_buff);
                if(err==false)
                {
                    iot_printf("uart qeue full,data send fail\r\n");
                }
            }

            os_mem_set(rx_buff,0,sizeof(rx_buff));
            USART_RX_STA=0;//所有位全赋值为0
        } 
    }
}

自己实现:

\r\n结尾的UART协议

#define UART_BAUDRATE 115200
#define UART_RX_SIZE 256
char rx_buff[UART_RX_SIZE];
_Bool clear_buff_flag=0;

void uart_test_poll(uint8_t port)
{
    int val,i=0;
    bool_t err;
    while (1)
    {
        os_delay(10);
        val=iot_uart_rx(port);
        if (val<0)
        {
            continue;
        }
        
        if(i<UART_RX_SIZE)
        {
            if((char)val=='\n')
            {
                if(rx_buff[i-1]=='\r')
                {
                    iot_printf("rx_buff:%s",rx_buff);
                    iot_printf("UART_TX SIZE:%d,Task send:%d\r\n",UART_RX_SIZE,UART_SIZE);
                    if(uart_qeue!=NULL)
                    {
                        err=os_queue_send(uart_qeue,rx_buff);
                        if(err==false)
                        {
                            iot_printf("uart qeue full,data send fail\r\n");
                        }
                    }
                    clear_buff_flag=1;                   
                }
            }
            else
            {
                rx_buff[i]=(char)val;
                i++;                               
            }

        }

        if(clear_buff_flag==1)
        {
            clear_buff_flag=0;
            os_mem_set(rx_buff,0,sizeof(rx_buff));
            i=0;
        } 
    }
}
上一篇:day11---2.9


下一篇:有趣且重要的css知识合集(3)好看的css