问题遇到的现象和发生背景
通过手机发送数据,控制led灯
问题相关代码,请勿粘贴截图
void USART3_IRQHandler(void) //串口3中断服务程序
{
u8 Res;
if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET) //接收中断(接收到的数据必须是0x0d 0x0a结尾)
{
Res =USART_ReceiveData(USART3); //读取接收到的数据
if(Res == ':'||USART_RX_STA>0)
{
if((USART_RX_STA&0x8000)==0)//接收未完成
{
if(USART_RX_STA&0x4000)//接收到了0x0d
{
if(Res!=0x0a)USART_RX_STA=0;//接收错误,重新开始
else USART_RX_STA|=0x8000; //接收完成了
}
else //还没收到0X0D
{
if(Res==0x0d)USART_RX_STA|=0x4000;
else
{
USART_RX_BUF[USART_RX_STA&0X3FFF]=Res ;
USART_RX_STA++;
}
}
}
}
}
}
下面是主函数里的循环部分
while(1)
{
if((USART_RX_STA&0x8000)==0x8000) //接收完成
{
switch(USART_RX_BUF[1])
{
case 'A':LED1_on();break;
case 'B':LED2_on();break;
case 'C':LED_off();break;
default:break;
}
USART_RX_STA = 0;
memset(USART_RX_BUF,0x00,sizeof(USART_RX_BUF));
}
}
运行结果及报错内容
大概就是
开机连接
发送A,无响应
发送B,响应A
发送B,响应B
每次发送就响应上次的数据
我的解答思路和尝试过的方法
这样可以暴力解决,但是我还是不懂为什么上面就不行
//void USART3_IRQHandler(void) //串口3中断服务程序
//{
// u8 Res;
//
// if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET) //接收中断(接收到的数据必须是0x0d 0x0a结尾)
// {
// Res = USART_ReceiveData(USART3); //读取接收到的数据
// if(Res == ':'||USART_RX_STA>0)
// {
// USART_RX_STA++;
// switch(Res)
// {
// case 'A':LED1_on();USART_RX_STA=0;break;
// case 'B':LED2_on();USART_RX_STA=0;break;
// case 'C':LED_off();USART_RX_STA=0;break;
// default:break;
// }
// }
// }
//
//}
我想要达到的结果
补充,换了个app把指令结尾的/n换成/r就解决了,可能和esp8266具体接受的指令格式有关,或者说手机发送指令的格式有关。具体我也不知道