使用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("
UART2 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("
");
// 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);
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
他不是马上死机的,有时会工作一会,死机是随机性的
一周热门 更多>