我目前在开发板(STM32L476RG)和GPS模块(GP-207U)之间的对话中遇到了问题。我的代码现在所做的是,它可以打印出从GPS到PuTTY的第一个数据包,并将继续打印相同的数据包,即使我从开发板上拔下Tx线,PuTTY仍将继续打印。我怀疑要么是存储接收到的值的缓冲区没有得到更新(实现),要么是HAL_UART_Receive()函数只运行一次。(接收函数在main中的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)中。
我尝试了所有基于我的猜测的方法,但都不起作用。
感谢您的任何帮助!
发布于 2018-03-17 13:57:50
我怀疑在第二次/后续尝试读取HAL_UART_Receive期间,对GPS的调用超时(在代码中为1000ms)。如果是这样,缓冲区内容将不会被清除或覆盖,从而导致重复打印相同的数据。阅读GPS数据表/手册可能有助于找出最大轮询速度(此处显示为~200ms,考虑到2x 100ms的延迟),并在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页
https://stackoverflow.com/questions/49313755
复制相似问题