【NUCLEO-L552ZE测评】+如何接收完整的串口数据(已解决)
[复制链接]
本帖最后由 hujj 于 2021-1-21 14:08 编辑
在测试串口通讯时,我在主循环中写入下面的代码,将接收的字符数尽量设大点,就可以接收到完整的数据:
if(__HAL_UART_GET_FLAG(&huart2,UART_FLAG_RXNE))
{
HAL_UART_Receive(&huart2,aBT_Buff,64,100);
LCD_write_ASCII(0,4,1,aBT_Buff);
nBT_size = 64;
printf("%s \r\n", aRxBuffer);
if(aRxBuffer[0]=='D'){ //通过串口设置日期时间(格式=DyyyymmddHHMMSS)
year = (aRxBuffer[1]-0x30)*1000+(aRxBuffer[2]-0x30)*100+(aRxBuffer[3]-0x30)*10+(aRxBuffer[4]-0x30);
month = (aRxBuffer[5]-0x30)*10+(aRxBuffer[6]-0x30);
day = (aRxBuffer[7]-0x30)*10+(aRxBuffer[8]-0x30);
hour = (aRxBuffer[9]-0x30)*10+(aRxBuffer[10]-0x30);
minute = (aRxBuffer[11]-0x30)*10+(aRxBuffer[12]-0x30);
second = 0;
DS1307_write_date();
}
}
我用上面的代码,通过串口调试助手向单片机发送固定格式的日期时间字符串(D202001201525),单片机能够完整的接收并且完成日期时间的设置,下图是通过串口调试助手向单片机发送数据,并收到返回的数据,说明接收和返回内容完全一致:
在单片机上也显示出了接收到的正确数据,并且DS1307日历模块的数据也得到更新:
这是发送字符串测试,可以正确地被单片机接收并返回:
在单片机的屏幕上正确地显示出来:
但同样的代码放在被主循环调用的函数中,却只能接收到首个字节的数据,后面的字节全部丢失了,代码如下:
void BT05_Init(void)
{
uint8_t ReceSize;
printf("AT\r\n");
if(__HAL_UART_GET_FLAG(&huart2,UART_FLAG_RXNE))
{
HAL_UART_Receive(&huart2,aBT_Buff,64,1000);
}
LCD_write_ASCII(0,3,1,(uint8_t *)"BT05=");
LCD_write_ASCII(30,3,1,aBT_Buff);
BT_display();
if(aBT_Buff[0]==0x4F){ //蓝牙模块有回应,开始设置
printf("AT+INQ\r\n");
if(__HAL_UART_GET_FLAG(&huart2,UART_FLAG_RXNE))
{
HAL_UART_Receive(&huart2,aBT_Buff,64,1000); //接收蓝牙返回的信息
}
LCD_write_ASCII(30,4,1,aBT_Buff);
BT_display();
LCD_write_ASCII(100,5,1,(uint8_t *)"BT05_Init OK! ");
}
else{ //蓝牙模块无回应
LCD_write_ASCII(100,5,1,(uint8_t *)"BT05_Init Fail!");
}
}
串口调试助手发送“OK”,模拟蓝牙回应:
在单片机屏幕上显示接收到的数据,只接收到“O”,第二行的五组十六进制数据分别是接收缓存数组的前五个,只有第一组是0x4F,其他都是0x00:
我想通过中断方式来接收,多次尝试也没有获得成功,中断处理的代码如下,不知道是哪里不对:
void USART2_IRQHandler(void)
{
/* USER CODE BEGIN USART2_IRQn 0 */
/* USER CODE END USART2_IRQn 0 */
HAL_UART_IRQHandler(&huart2);
/* USER CODE BEGIN USART2_IRQn 1 */
HAL_UART_Receive(&huart2,aBT_Buff,64,100);
// HAL_UART_Receive_IT(&huart2, aRxBuffer, 64);
if (HAL_UART_Transmit_IT(&huart2, aRxBuffer, 64) != HAL_OK)
{
Error_Handler();
}
/* USER CODE END USART2_IRQn 1 */
}
在测试过程中我将中断处理里面的USER CODE之间的代码注释掉,在主循环中的轮询方式竟然也只能接收一个字符的数据,不知是什么原因。
|