OpenEdv-开源电子网

标题: ESP8266与单片机连接问题 [打印本页]

作者: e99996    时间: 2015-10-23 18:56
标题: ESP8266与单片机连接问题
之前的问题已经解决了,但现在的问题更加令我奇怪。比如说,用串口助手对模块发送“AT\r\n”,那么模块返回的就是“AT\r\r\n\r\nOK\r\n”,我按这个为标准,来确定指令是否成功执行。但是后来我用JTAG在线调试时,查看那个接收串口缓冲数据的数组时,发现返回的只有"AT"(单片机发送为"AT\r\n"),但是指令确是照常执行的,望大神解惑,谢谢!!!
作者: 正点原子    时间: 2015-10-23 18:56
你这个模块会返回:  “AT\r\r\n\r\nOK\r\n”
从哪里看来的?
具体的可以直接拿串口助手验证下.
作者: e99996    时间: 2015-10-27 22:55
是这样的,我是直接看接收回来的16进制数,得出的结果,但是单片机的接收数组只能接收到AT,后面的东西都没了,苦恼几天了,望原子哥能帮下忙!!!
作者: e99996    时间: 2015-10-27 22:57
回复【2楼】正点原子:
---------------------------------
那个得到的16进制数是串口助手里的,单片机并没有显示
作者: e99996    时间: 2015-10-27 23:13
[mw_shl_code=c,true]void USART1_IRQHandler(void) //串口1中断服务程序 { u8 Temp_Clear_IDLE=Temp_Clear_IDLE; u8 Res; #ifdef OS_TICKS_PER_SEC //如果时钟节拍数定义了,说明要使用ucosII了. OSIntEnter(); #endif if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) { Res =USART_ReceiveData(USART1);//(USART1->DR); //读取接收到的数据 if((USART_RX_STA&0x8000)==0)//接收未完成 { if(USART_RX_STA&0x4000)//接收到了0x0d { if(Res!=0x4B)USART_RX_STA=0;//接收错误,重新开始 else USART_RX_STA|=0x8000; //接收完成了 //接收到'K' } else { if(Res==0x4F) //接收到'O' USART_RX_STA|=0x4000; else //还没收到'O' { USART_RX_BUF[USART_RX_STA&0X3FFF]=Res ; USART_RX_STA++; if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0;//接收数据错误,重新开始接收 } } } } //// if(USART_GetITStatus(USART1, USART_IT_IDLE) != RESET) //空闲总线中断 //// { // if((USART_RX_BUF[USART_RX_STA] == 0x4F)&&(USART_RX_BUF[USART_RX_STA+1] == 0x4B)) // { // Temp_Clear_IDLE=USART1->SR; // Temp_Clear_IDLE=USART1->DR;//清除USART_IT_IDLE位 //// USART_RX_STA =0; // USART_RX_STA|=0x8000; // } //// } #ifdef OS_TICKS_PER_SEC //如果时钟节拍数定义了,说明要使用ucosII了. OSIntExit(); #endif }[/mw_shl_code]

这个是我的中断服务程序,基本套用原子哥的,就只是把接收标志改为了OK 而已,但就出现了这样的情况。
作者: e99996    时间: 2015-10-27 23:14
发送用的是printf函数,这个应该不要紧的吧!
作者: prettywolf    时间: 2015-10-28 00:23
这个是你的串口接收处理得不好造成的。
我的接收处理中断是这样:
void USART1_IRQHandler(void)                 //串口1中断
{
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)  //接收中断
{
RecvData[RecvIndex] = USART_ReceiveData(USART1);//读取接收到的数据
RecvIndex++;     
    }
if(USART_GetITStatus(USART1,USART_IT_IDLE) == SET)
{
USART_ClearFlag(USART1,USART_FLAG_ORE);
USART_ReceiveData(USART1);
//Res = USART_ReceiveData(USART1);
RecvDone = 1;
*(RecvData+RecvIndex) = 0;
RecvIndex = 0;
}


发送指令和处理这样子:
printf("AT+CWJAP=\"CXNET\",\"12345\"\r\n");//发送指令到8266
while(!WaitForMsg("OK"));//等待返回OK字符

u8 WaitForMsg(char *str)//如果在这个函数加上超时判断就更好了
{
while(!RecvDone);
RecvDone = 0;
if(strstr(RecvData,str))
return 1;
else
return 0;
}
作者: prettywolf    时间: 2015-10-28 00:26
回复【2楼】正点原子:
---------------------------------
这个模块的确是这样子返回的
作者: e99996    时间: 2015-11-24 20:48
回复【7楼】prettywolf:
---------------------------------
但是你这样处理的话,若是执行指令失败的情况,像是连接路由器连接不上,一样都会返回OK的,那不是失败的指令也当作成功过去了?
作者: prettywolf    时间: 2015-11-24 21:56
回复【9楼】e99996:
---------------------------------
我说的重点是这个:if(USART_GetITStatus(USART1,USART_IT_IDLE) == SET)
作者: e99996    时间: 2015-11-24 23:32
回复【10楼】prettywolf:
---------------------------------
好吧,我原本也用了这个中断,但不知为何老是进不去,后来就注释掉了,请问这个中断(据我理解)是不是就是,等一段诗句发送完后,会自动进去,就当是接收完成中断吗?
作者: prettywolf    时间: 2015-11-26 20:14
回复【11楼】e99996:
---------------------------------
是这样的,我这样子处理工作很正常




欢迎光临 OpenEdv-开源电子网 (http://www.openedv.com/) Powered by Discuz! X3.4