本帖最后由 hpdell 于 2016-5-17 09:33 编辑 使用cube库接收GPS数据容易死机 ??? 同样的gps接收程序,使用标准库接收时完全没有任何问题的。 程序如下: void MX_USART2_UART_Init(void) { huart2_gps.Instance = USART2; huart2_gps.Init.BaudRate = 9600; // 591 的GPS 模块的波特率是 9600 huart2_gps.Init.WordLength = UART_WORDLENGTH_8B; huart2_gps.Init.StopBits = UART_STOPBITS_1; huart2_gps.Init.Parity = UART_PARITY_NONE; huart2_gps.Init.Mode = UART_MODE_RX; // 单片机的 USART2 TX 引脚作为普通的引脚使用 huart2_gps.Init.HwFlowCtl = UART_HWCONTROL_NONE; huart2_gps.Init.OverSampling = UART_OVERSAMPLING_16; // huart1.Init.OneBitSampling = UART_ONEBIT_SAMPLING_DISABLED; // usart2 使用 // huart1.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT; // usart2 使用 HAL_UART_Init(&huart2_gps); GPS_PowerInit(); if(HAL_UART_Receive_IT(&huart2_gps, &gps.Buff, 1) != HAL_OK) // 启动一次接收中断 { printf("\r\nUART2 Receive Init IT Error"); } } #define NEMA_NUM_MAX 6 //缓冲的NEMA语句数量 #define NEMA_CHAR_MAX 120 //缓冲的NEMA语句字符数量 struct { u8 isupdated; //NEMA 缓冲区更新标志 char buffer[NEMA_CHAR_MAX]; //NEMA 缓冲区 }GPS_NEMA[NEMA_NUM_MAX] ; /* ***************************************************************************** * 在usart 中断 中调用 ***************************************************************************** */ void GPS_UsartRx(u8 buffer) { static u8 NEMA_count = 0; static u8 char_count = 0; if(buffer == '$') { GPS_NEMA[NEMA_count].isupdated = 1; //将上面一条语句打上更新标志 NEMA_count++; if(NEMA_count > (NEMA_NUM_MAX-1)) { NEMA_count = 0; } GPS_NEMA[NEMA_count].isupdated = 0; //将本条语句打上未更新标志, 指向结构体里面的下一个变量 GPS_NEMA[NEMA_count].buffer[0] = '$'; char_count = 1; } else { if(char_count < NEMA_CHAR_MAX-1) GPS_NEMA[NEMA_count].buffer[char_count++] = buffer; } } void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) { if(huart->Instance == USART2) // GPS 接收使用 { GPS_UsartRx( gps.Buff ); HAL_UART_Receive_IT(&huart2_gps, &gps.Buff, 1); // 不知道是不是此处的开关动作太频繁造成的 ???????????????????? // if(gps.Buff == '$') // 测试使用 // printf("\r\n"); // printf("%s", (char *) & gps.Buff); } } //串口接收中断函数 void USART2_IRQHandler(void) { // 标准库 // if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET) // 接收中断有效 ; // { // USART_ClearITPendingBit(USART2, USART_IT_RXNE); // 清除USART1的接收中断 // //gpsbuff = (uint16_t)((USART2->DR) & (uint16_t)0x01FF); // gpsbuff = USART_ReceiveData(USART2); // 返回USARTx最近接收到的数据 ; // GPS_UsartRx(gpsbuff); // } HAL_UART_IRQHandler( & huart2_gps); } |
你好,昨天发帖时,代码死活发不上去,今天刚刚把代码补上去了,你看看是什么情况 ?
目前我也搞不清哟,但是gps接收部分以前是使用在标准库里面的,完全木有任何问题,目前想使用在这个cube的库上,结果却不行了