在串口实现的过程中需要注意的几点:
1、在RT_WEAK void rt_hw_board_init()函数中,把此打印到控制台的串口注册入口函数rt_console_set_device(RT_UART1_DEVICE_NAME)屏蔽掉,如果没有屏蔽此函数,则不会触发串口中断回调函数,此串口不能作为正常通讯串口使用。
2、把HAL_UART_RxCpltCallback函数和HAL_UART_RxHalfCpltCallback(UART_HandleTypeDef *huart)函数中的调用dma_isr(&uart->serial)函数屏蔽掉,这样就不会出现拆包的问题,验证串口DMA+空闲中断是否存在拆包的问题方法如下:
(1)程序中用strncmp函数实现串口接收到数据与原有的数据进行对比,串口接收到的数据与原有的数据一致,则原封不动返回给串口调试助手,否则往串口调试助手打印”Data Error!!!rn”。
......
/* 从消息队列中读取消息*/
result = rt_mq_recv(&rx_mq, &msg, sizeof(msg), 10);
if (result == RT_EOK)
{
/*从串口读取数据*/
rx_length = rt_device_read(msg.dev, 0, rx_buffer, msg.size);
/*判断串口接收到的数据是否被拆包,接收串口数据缓存是rx_buffer*/
if(0 == strncmp("helloworld!!!I am Real time System,My name is rt-thread!!!",rx_buffer,strlen("helloworld!!!I am Real Time System,My name is rt-thread!!!!")))
{
/*把收到的数据原封不动的返回给串口调试助手*/
rt_device_write(msg.dev, 0, rx_buffer, rx_length);
}else{
/*数据被拆包或者串口没有配置正确导致数据不完整*/
rt_device_write(msg.dev, 0, "Data Error!!!rn",
strlen("Data Error!!!rn"));
}
}
......
(2)在串口调试助手中发送”helloworld!!!I am Real Time System,My name is rt-thread!!!”字符串, 如果数据没有拆包,则串口会把”helloworld!!!I am Real Time System,My name is rt-thread!!!”原封不动的返回,发多少条,则返回多少条,否则就是出现拆包或者串口配置不正确导致数据收发不一致,串口调试助手会收到”Data Error!!!rn”字符串。