
串口通讯是单片机最常用的通讯方式之一,其中的异步通讯以方便快捷的特点更广泛地被应用,本贴记录了使用UART2与电脑的串口助手进行收发通讯的测试过程。 为了方便调试,本次测试没有采用默认的BSP串口设置,而是直接开启UART2,设置仍按默认的8+n+1模式,通讯速率为115200Hz,下图是CubeMX设置界面: 首先测试的是利用重定向函数printf发送数据,在魔术棒里选择USR MicroLIB,然后添加重定向函数,就可以轻松地用printf函数发送数据了: 接收定长的数据也比较容易实现,在主程序中如下设置就可以顺利地接收到数据了: __HAL_UART_ENABLE_IT(&huart2,UART_IT_IDLE); //打开串口空闲中断 HAL_UART_Receive_IT(&huart2,RxBuff,64); //启用UART2接收中断 如果不能确定接收的数据长度,使用上述方式就不容易区分之前和本次接收的数据,应用起来就不方便,应该采用每次接收一个字节的数据并保存在缓存区里的方式。按照下列方式设置: __HAL_UART_ENABLE_IT(&huart2,UART_IT_RXNE); //打开串口接收中断 HAL_UART_Receive_IT(&huart2,&RxByte,1); //启用UART2接收中断 然后在中断回调函数里将接收到的数据保存到缓存区中: void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) { HAL_UART_Receive_IT(&huart2,&RxByte,1); //开启下次接收 RxBuff[RxLen++] = RxByte; //保存接收到的数据 } 最后在主循环中根据全局变量RxLen>0来判断是否接收到了数据并进行处理。下面是中断回调函数和自定义发送函数的截图: 使用printf回送接收到的数据时会遇到截尾的情况,即超过13个字节后数据回送不全。通过编写自定义发送函数,可以改善这种现象,但超过29个字节时也会出现这种现象,还不知道是什么原因。 |