我目前在开发板(STM32L476RG)和GPS模块(GP-207U)之间进行通话时遇到问题。我的代码现在做的是,它可以将从GPS接收的第一个数据包打印到PuTTY,并且将继续打印相同的数据包,即使我从开发板上拔下Tx线,PuTTY仍然会继续打印。我怀疑存储接收值的缓冲区没有得到更新(满足)或HAL_UART_Receive()函数只运行一次。 (接收功能在主要的While(1)中,所以我很困惑)
enter image description here (我没有拔掉GPS,Putty仍然打印,所以接收功能在收到GPS的第一个数据包后没有做任何事情)
/*retrive data from GPS*/
char UARTRxBuffer[1024] = "";
char RxBuffer[1024] = "";
void GetGPS(void) {
HAL_UART_Receive(&huart3, (uint8_t *)UARTRxBuffer, 1024, 1000);
HAL_Delay(100);
sprintf(RxBuffer,"%s\r\n\r\n", UARTRxBuffer);
HAL_UART_Transmit(&huart2, (uint8_t *)RxBuffer, strlen(RxBuffer), 5000);
HAL_Delay(100);
}
GetGPS()放入main()中的while(1)。
我根据我的猜测尝试了一切,但都没有奏效。
感谢您提供任何帮助!
答案 0 :(得分:0)
我怀疑在第二次/后续尝试读取GPS期间,HAL_UART_Receive
的呼叫超时(代码中为1000 ms)。如果是这样,缓冲区内容将不会被清除或覆盖,导致相同的数据被反复打印。阅读GPS数据表/手册可能有助于找出最大轮询速度(考虑到2x 100 ms延迟,这似乎是~200ms),如果GPS设备无法跟上,则调整延迟。
尝试此确认
HAL_StatusTypeDef status = HAL_UART_Receive(/*same as above*/);
if(status == HAL_OK){
// got valid data
sprintf(RxBuffer,"%s\r\n\r\n", UARTRxBuffer);
HAL_UART_Transmit(&huart2, (uint8_t *)RxBuffer, strlen(RxBuffer), 5000);
}
else{
sprintf(RxBuffer,"read timeout.\r\n\r\n");
HAL_UART_Transmit(&huart2, (uint8_t *)RxBuffer, strlen(RxBuffer), 5000);
}
API参考文档here第1037/2232页