2016/1/20 首先,该模块使用了AT指令进行操作,我们要做的,就是将需要的AT指令,以字符串的形式发给模块,即可实现相应的功能。 1. wifi模块ESP8266的默认波特率是115200,但是单片机不能达到那么快的传输速率,只能使用4800bps,那么设置的时候,必不可少的要先用转串口调试下载器(速度比较快,而且wifi模块默认115200bps,用单片机不能正确更改波特率,转串口工具可以),设置指令,AT+UART=4800,8,1,0,0,详细见手册,可以灵活设置。 2. 设置完成以后,wifi模块在掉电以后还是会保持4800bps,下次使用,不再需要修改。 3. 在使用单片机对wifi模块进行操作的时候,首先串口的波特率要设为4800,也就是TH1的初值必须是0xfa,这样再晶振为11.0592MHz的时候,可以准确的得到4800bps。 4. 然后,先不插wifi模块的TX,DX到单片机的P30和P31口,因为下载程序的时候需要使用到这两个口,不能被干扰。下载程序完成以后,先断电,再把wifi模块的两个引脚接上,注意,模块和单片机上的TX,DX是交叉接的,这样才能正确工作,不像最小系统板下载程序的时候是对应接的。 5. 最后再把单片机上电。还有一个注意的地方,就是,因为4800bps的话,传输速率比较慢,所以,在程序中每发送一条AT指令,必须要加以一定的延时,起码500ms我认为,这样保证模块的初始化时正确的。 6. 打开手机,连上对应的wifi,再输入对应的IP地址和端口号,以及密码,就可以传输数据了,但是让wifi模块把单片机上的数据传输到手机上还没有完成,有待增加此方法。 7. 经过一下午的调试,找到如何解决问题了,原来问题在于我的操作问题。每次创建了wifi,要先连上wifi才能够让wifi传数据给手机,手机没自动连接! 2016/1/21 1. 注意:ESP8266作为TCP Server时,存在超时机制,一段时间没有数据往来,就把client踢掉,所以程序中要有保持连接的操作,或者可以通过设置AT指令,设置不能踢掉客户端模式,但是不建议这样做。 2. 在设置模式等都完成以后,用手机可以连上wifi模块,可以向wifi模块发送数据。但是想要把wifi模块上的数据回过来,需要通过客户的连接号才能辨清是哪一个client发送过来请求,例如:0,CONNECT,然后再把数据根据连接号把数据发送给该client,这样保证传输数据的正确性。接收到数据的格式:+IPD,0,3:ddf;+IPD,0,7:gfsghhf,这样的话,需要通过字符串的辨析,才能知道哪个客户端连接号发来数据了,例如上面举例,是客户端连接号为0,发送过来数据了。 3. 使用AT指令时,必须是以字符串的形式传输到wifi模块中,所以,需要用到uart_sendstr,但是,有的指令是字符串中包含了字符串,编译的时候不能正确识别,所以需要字符串转UTF-8工具(ESP8266使用的是UTF-8标准),注意不能删掉字符串中的空,逗号,句号换行符什么的,如图 4. 2016/1/23 今天发现,第3条可以有更好的解决方法,而且很简单,只是用的比较少,我也没想到,字符串中的字符串使用\”….\”表示即可!(需要好好补补C语言了) 5. 51单片机程序中,需要对字符串进行很多操作,例如:AT指令和参数的拼接(这样比较灵活,参数最好也是字符串形式,减少工作量),截取wifi模块发送给单片机的字符串提示信息等等,所以我们需要做的是对字符串进行正确操作,每一个字符串函数都要测试功能,确保正确才能加入使用。 6. 刚刚新买的wifi模块,要想在51单片机上使用,就要将波特率设的比较低,那么在使用AT+UART=4800,8,1,0,0命令的时候,一旦将最后第二个数据改了,那么串口调试软件上也要相应的更改校验方式,不然,下面的命令全部无用。 7. 关于wifi模块的IP地址:wifi模块的IP也是可以设置的,如AT+CIPAP="192.168.5.1" ,所以还是要对wifi模块进行读取IP的操作,以防被篡改IP地址。在显示能够连接时,必须要显示正确的IP地址,所以我们需要在程序一开始获取IP地址。 8. 关于多连接问题:将先后连接的客户端,根据连接的先后顺序,手动给它们排出优先级序列,和客户连接号无关的序列,这样就能保持一个多连接的有优先级的队列,控制小车。当然,在使用相应优先级的时候,必须同时采用该优先级对应的客户连接号,才能准确的与某一个客户端收发信息。(有待编写程序时完善) 9. 关于wifi模块回显字符串截取问题:由于回显的字符串是很不稳定的,就是有时候某一句后面带有\r\n,有时候又没有,而且串口也不会发送\0到SBUF中,那么,字符串的截取就比较困难了,或者说是笨方法。只能将\n作为字符串的读取辨析的开始,也就是一旦读取到了\n,设置标志位,表示下一个字符开始,就要接收,拼接并且辨析。命令的话,只读取回显中的某一位比较特别的位作为命令。
|