电路板和GPS模块之间的通信

时间:2018-03-16 05:29:56

标签: gps stm32 uart

我目前在开发板(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)。

我根据我的猜测尝试了一切,但都没有奏效。

感谢您提供任何帮助!

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页