完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
之前的问题已经解决了,但现在的问题更加令我奇怪。比如说,用串口助手对模块发送“ATrn”,那么模块返回的就是“ATrrnrnOKrn”,我按这个为标准,来确定指令是否成功执行。但是后来我用JTAG在线调试时,查看那个接收串口缓冲数据的数组时,发现返回的只有"AT"(单片机发送为"ATrn"),但是指令确是照常执行的,望大神解惑,谢谢!!!
|
|
相关推荐
11个回答
|
|
|
|
|
|
是这样的,我是直接看接收回来的16进制数,得出的结果,但是单片机的接收数组只能接收到AT,后面的东西都没了,苦恼几天了,望原子哥能帮下忙!!!
|
|
|
|
那个得到的16进制数是串口助手里的,单片机并没有显示
|
|
|
|
[C] 纯文本查看 复制代码
void USART1_IRQHandler(void) //串口1中断服务程序{u8 Temp_Clear_IDLE=Temp_Clear_IDLE;u8 Res;#ifdef OS_TICKS_PER_SEC //如果时钟节拍数定义了,说明要使用ucosII了.OSIntEnter(); #endifif(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} 这个是我的中断服务程序,基本套用原子哥的,就只是把接收标志改为了OK 而已,但就出现了这样的情况。 |
|
|
|
发送用的是printf函数,这个应该不要紧的吧!
|
|
|
|
这个是你的串口接收处理得不好造成的。
我的接收处理中断是这样: 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"rn");//发送指令到8266 while(!WaitForMsg("OK"));//等待返回OK字符 u8 WaitForMsg(char *str)//如果在这个函数加上超时判断就更好了 { while(!RecvDone); RecvDone = 0; if(strstr(RecvData,str)) return 1; else return 0; } |
|
|
|
这个模块的确是这样子返回的
|
|
|
|
但是你这样处理的话,若是执行指令失败的情况,像是连接路由器连接不上,一样都会返回OK的,那不是失败的指令也当作成功过去了?
|
|
|
|
我说的重点是这个:if(USART_GetITStatus(USART1,USART_IT_IDLE) == SET)
|
|
|
|
好吧,我原本也用了这个中断,但不知为何老是进不去,后来就注释掉了,请问这个中断(据我理解)是不是就是,等一段诗句发送完后,会自动进去,就当是接收完成中断吗?
|
|
|
|
是这样的,我这样子处理工作很正常
|
|
|
|
只有小组成员才能发言,加入小组>>
7342 浏览 9 评论
2433 浏览 2 评论
为什么我用esp8266做TCP服务器网络调试助手一直连接不上去?
9532 浏览 3 评论
为什么我的ESP8266 AT指令一直返回error无法正常使用?
7359 浏览 0 评论
4190 浏览 3 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-12 07:39 , Processed in 0.861240 second(s), Total 67, Slave 60 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号