中级会员
积分 294
金钱 294
注册时间 2018-5-3
在线时间 69 小时
1 金钱
发:at+send=lora:1:000B0000079600000000
收:OK
收:at+recv=0,-32,7,0
发:at+set_config=device:sleep:1
发:at+set_config=device:sleep:1
收:OK Sleep
一般情况下,数据发送完只回应OK。但偶尔会在OK后面接在回应at+recv=0,-32,7,0;导致后续串口在发送sleep指令时,同时接收at+recv=0,-32,7,0;
这个情况导致sleep指令模块无法识别,还有mcu的串口接收中断无法进入了,必须重新初始化,这个怎么解决????
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
/* Prevent unused argument(s) compilation warning */
UNUSED(huart);
/* NOTE: This function Should not be modified, when the callback is needed,
the HAL_UART_TxCpltCallback could be implemented in the user file
*/
RX_BUFF[RX_CNT]=aRxBuffer;
if((RX_BUFF[RX_CNT] == 0x0A) && ((RX_BUFF[RX_CNT-1] == 0x0D)))//判断接收是否结束
{
RX_CNT = 0;
//接收完成标志位
if(PorRest_Flag ==2)
{
//不判断接收错错误数据,收到错误数据,直接等待超时
if( (RX_BUFF[0] == 0x4F) && (RX_BUFF[1] == 0x4B) && (RX_BUFF[15] == 0x0D) && (RX_BUFF[16] == 0x0A)) //OK Join Success
{
HAL_TIM_Base_Stop_IT(&htim14);
Send_Join_Count = 0;
memset(RX_BUFF,0,20);
join_Retran_Times = 0;
PorRest_Flag = 0;
Sleep_flag = 1;
}
}
else if(Send_Complete_Flag == 2)
{
if( (RX_BUFF[0] == 0x4F) && (RX_BUFF[1] == 0x4B) && (RX_BUFF[2] == 0x0D) && (RX_BUFF[3] == 0x0A))//OK
{
HAL_TIM_Base_Stop_IT(&htim14);
Send_Date_count = 0;
memset(RX_BUFF,0,20);
Data_Retran_Times = 0;
Send_Complete_Flag = 0;
Sleep_flag = 1;
//// DatePack_Num =0x55;
//// HAL_UART_Transmit(&huart1,&DatePack_Num,1,0xffff);
}
}
else if(Send_Sleep_Flag == 2)
{
//不判断接收错错误数据,收到错误数据,直接等待超时
// if( (RX_BUFF[0] == 0x4F) && (RX_BUFF[1] == 0x4B) && (RX_BUFF[2] == 0x20) && (RX_BUFF[3] == 0x53)&& (RX_BUFF[4] == 0x6C) && (RX_BUFF[5] == 0x65)&& (RX_BUFF[6] == 0x65)&& (RX_BUFF[6] == 0x70)) //OK Sleep
if( (RX_BUFF[0] == 0x4F) && (RX_BUFF[1] == 0x4B) && (RX_BUFF[8] == 0x0D) && (RX_BUFF[9] == 0x0A)) //OK Sleep
{
HAL_TIM_Base_Stop_IT(&htim14);
Send_Sleep_Count = 0;
memset(RX_BUFF,0,20);
Sleep_flag = 2;
Send_Sleep_Flag = 0;
Sleep_Retran_Times = 0;
}
}else{
memset(RX_BUFF,0,20);
}
}else{
RX_CNT++;
}
HAL_UART_Receive_IT(&huart1, (uint8_t*)&aRxBuffer, 1);//每接收一个字节后,重新开启接收中断
}
/* HAL_UART_Transmit 函数(这是一个阻塞的发送函数,无需重复判断串口是否发送完成)
发送每个字符,直到遇到
空字符才停止发送。*/
void Usart_SendString(UART_HandleTypeDef *usarthandle,uint8_t *str)
{
unsigned int k=0;
do
{
HAL_UART_Transmit(usarthandle,(uint8_t *)(str + k) ,1,1000);
k++;
} while(*(str + k)!='\0');
}
我来回答