串口协议\r\n结尾
初步实现功能使用串口发送数据,通过队列发送给SPI,然后用逻辑分析仪抓取一下spi波形,跟串口发送数据是否一致。
做这个项目发现自己对于串口协议不是太熟悉,因为之前学校学习使用的正点原子一直都是用那个串口协议,简单了解一下程序没有太看懂,也没有深入了解。如今用到了就是自己实现了一下,发现最后结尾有一个\r混进去了,不过是意料之中,但是没有找到合适的办法,就去借鉴一下之前学习stm32时候正点原子写的代码。
【小贴士】在介绍之前首先了解回车和换行的表示方法和区别:
回车:回到当前行行首,不会回到下一行,如果接着输入则会覆盖本行以前的内容。
换行:换到当前位置的下一行,而不会回到首行。
回车 | 换行 |
---|---|
ox0d | 0x0a |
\r | \n |
参考正点原子串口例程
#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
}
}
}
自己实现:
#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;
}
}
}