OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3177|回复: 2

ESP8266串口接收AT指令返回信息的问题

[复制链接]

4

主题

8

帖子

0

精华

初级会员

Rank: 2

积分
54
金钱
54
注册时间
2018-11-20
在线时间
19 小时
发表于 2019-8-21 13:04:52 | 显示全部楼层 |阅读模式
1金钱
stm32发送AT指令给ESP8266后返回的信息为:
AT+CWLAP
+CWLAP4,"123456",-70,"38:e3:c5:88:0c:f4",3,-4,0,5,3,7,1)

OK


我的想法是通过判断OK来判断是否完成接收,但总是只收到AT+CWLAP,想请问下是哪里出了问题,或者有什么办法让ESP8266返回的信息只有+CWLAP4,"123456",-70,"38:e3:c5:88:0c:f4",3,-4,0,5,3,7,1)

我的程序如下:
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
        if(huart->Instance==USART1)//如果是串口1
        {
                if((USART_RX_STA&0x8000)==0)//接收未完成
                {
                        if(USART_RX_STA&0x4000)//接收到了'O'
                        {
                                if(aRxBuffer[0]!=0x4B)USART_RX_STA=0;//接收错误,重新开始
                                else USART_RX_STA|=0x8000;        //接收完成了
                        }
                        else //还没收到'O'
                        {       
                                if(aRxBuffer[0]==0x4F)USART_RX_STA|=0x4000;
                                else
                                {
                                        USART_RX_BUF[USART_RX_STA&0X3FFF]=aRxBuffer[0] ;
                                        USART_RX_STA++;
                                        if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0;//接收数据错误,重新开始接收          
                                }                 
                        }
                }
        }
}


//串口1中断服务程序
void USART1_IRQHandler(void)                       
{
        u32 timeout=0;
#if SYSTEM_SUPPORT_OS                 //使用OS
        OSIntEnter();   
#endif
       
        HAL_UART_IRQHandler(&UART1_Handler);        //调用HAL库中断处理公用函数
       
        timeout=0;
    while (HAL_UART_GetState(&UART1_Handler) != HAL_UART_STATE_READY)//等待就绪
        {
//         timeout++;////超时处理
//     if(timeout>HAL_MAX_DELAY) break;               
        }

        timeout=0;
        while(HAL_UART_Receive_IT(&UART1_Handler, (u8 *)aRxBuffer, RXBUFFERSIZE) != HAL_OK)//一次处理完成之后,重新开启中断并设置RxXferCount为1
        {
//         timeout++; //超时处理
//         if(timeout>HAL_MAX_DELAY) break;       
        }
#if SYSTEM_SUPPORT_OS                 //使用OS
        OSIntExit();                                                                                           
#endif
}

main函数的while循环中的程序:
if(USART_RX_STA&0x8000)
                {
                        LCD_Clear(WHITE);
                        Show_Str(0,200,260,96,(u8*)USART_RX_BUF,16,0);
                        USART_RX_STA=0;
                }



正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165508
金钱
165508
注册时间
2010-12-1
在线时间
2115 小时
发表于 2019-8-22 02:42:06 | 显示全部楼层
回复

使用道具 举报

2

主题

43

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
484
金钱
484
注册时间
2017-11-6
在线时间
162 小时
发表于 2019-8-23 10:09:35 | 显示全部楼层
用IDLE+DMA来接收不定长数据  比你这种方式方便多了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-16 03:29

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表