OpenEdv-开源电子网

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

ESP8266与单片机连接问题

[复制链接]

10

主题

33

帖子

0

精华

初级会员

Rank: 2

积分
125
金钱
125
注册时间
2015-4-22
在线时间
11 小时
发表于 2015-10-23 18:56:10 | 显示全部楼层 |阅读模式
5金钱
之前的问题已经解决了,但现在的问题更加令我奇怪。比如说,用串口助手对模块发送“AT\r\n”,那么模块返回的就是“AT\r\r\n\r\nOK\r\n”,我按这个为标准,来确定指令是否成功执行。但是后来我用JTAG在线调试时,查看那个接收串口缓冲数据的数组时,发现返回的只有"AT"(单片机发送为"AT\r\n"),但是指令确是照常执行的,望大神解惑,谢谢!!!

最佳答案

查看完整内容[请看2#楼]

你这个模块会返回:  “AT\r\r\n\r\nOK\r\n” 从哪里看来的? 具体的可以直接拿串口助手验证下.
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165353
金钱
165353
注册时间
2010-12-1
在线时间
2108 小时
发表于 2015-10-23 18:56:11 | 显示全部楼层
你这个模块会返回:  “AT\r\r\n\r\nOK\r\n”
从哪里看来的?
具体的可以直接拿串口助手验证下.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

10

主题

33

帖子

0

精华

初级会员

Rank: 2

积分
125
金钱
125
注册时间
2015-4-22
在线时间
11 小时
 楼主| 发表于 2015-10-27 22:55:58 | 显示全部楼层
是这样的,我是直接看接收回来的16进制数,得出的结果,但是单片机的接收数组只能接收到AT,后面的东西都没了,苦恼几天了,望原子哥能帮下忙!!!
回复

使用道具 举报

10

主题

33

帖子

0

精华

初级会员

Rank: 2

积分
125
金钱
125
注册时间
2015-4-22
在线时间
11 小时
 楼主| 发表于 2015-10-27 22:57:01 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
那个得到的16进制数是串口助手里的,单片机并没有显示
回复

使用道具 举报

10

主题

33

帖子

0

精华

初级会员

Rank: 2

积分
125
金钱
125
注册时间
2015-4-22
在线时间
11 小时
 楼主| 发表于 2015-10-27 23:13:32 | 显示全部楼层
[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 而已,但就出现了这样的情况。
回复

使用道具 举报

10

主题

33

帖子

0

精华

初级会员

Rank: 2

积分
125
金钱
125
注册时间
2015-4-22
在线时间
11 小时
 楼主| 发表于 2015-10-27 23:14:51 | 显示全部楼层
发送用的是printf函数,这个应该不要紧的吧!
回复

使用道具 举报

14

主题

97

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
204
金钱
204
注册时间
2014-12-16
在线时间
10 小时
发表于 2015-10-28 00:23:43 | 显示全部楼层
这个是你的串口接收处理得不好造成的。
我的接收处理中断是这样:
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;
}
回复

使用道具 举报

14

主题

97

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
204
金钱
204
注册时间
2014-12-16
在线时间
10 小时
发表于 2015-10-28 00:26:14 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
这个模块的确是这样子返回的
回复

使用道具 举报

10

主题

33

帖子

0

精华

初级会员

Rank: 2

积分
125
金钱
125
注册时间
2015-4-22
在线时间
11 小时
 楼主| 发表于 2015-11-24 20:48:11 | 显示全部楼层
回复【7楼】prettywolf:
---------------------------------
但是你这样处理的话,若是执行指令失败的情况,像是连接路由器连接不上,一样都会返回OK的,那不是失败的指令也当作成功过去了?
回复

使用道具 举报

14

主题

97

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
204
金钱
204
注册时间
2014-12-16
在线时间
10 小时
发表于 2015-11-24 21:56:13 | 显示全部楼层
回复【9楼】e99996:
---------------------------------
我说的重点是这个:if(USART_GetITStatus(USART1,USART_IT_IDLE) == SET)
回复

使用道具 举报

10

主题

33

帖子

0

精华

初级会员

Rank: 2

积分
125
金钱
125
注册时间
2015-4-22
在线时间
11 小时
 楼主| 发表于 2015-11-24 23:32:10 | 显示全部楼层
回复【10楼】prettywolf:
---------------------------------
好吧,我原本也用了这个中断,但不知为何老是进不去,后来就注释掉了,请问这个中断(据我理解)是不是就是,等一段诗句发送完后,会自动进去,就当是接收完成中断吗?
回复

使用道具 举报

14

主题

97

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
204
金钱
204
注册时间
2014-12-16
在线时间
10 小时
发表于 2015-11-26 20:14:46 | 显示全部楼层
回复【11楼】e99996:
---------------------------------
是这样的,我这样子处理工作很正常
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-25 11:52

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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