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 |