当前位置:   article > 正文

ESP8266 基于AT 指令的c51编程_c51 8266 at指令

c51 8266 at指令
AT指令集是从终端设备(Terminal Equipment, TE) 数据终端设备 Data Terminal
Equipment DTE) 向终端适配器 (Terminal Adapter TA) 数据电路终端设备 (Data Circuit
Terminal Equipment DCE) 发送的。
其对所传输的数据包大小有定义:即对于 AT 指令的发送,除 AT 两个字符外,最多可以接收 1056
字符的长度(包括最后的空字符)。
每个 AT 命令行中只能包含一条 AT 指令;对于由终端设备主动向 PC 端报告的 URC 指示或者 response
响应,也要求一行最多有一个,不允许上报的一行中有多条指示或者响应。 AT 指令以回车作为结
尾,响应或上报以回车换行为结尾。
ESP-8266出厂波特率正常是115200, 注意:AT指令,控制类都要加回车,数据传输时不加回车

一,esp8266当成wifi接收器

第一步上电后发送AT指令测试通信及模块功能是否正常

  1. AT
  2. OK

第二步通过命令配置成9600波特率

AT+UART=9600,8,1,0,0

入网设置及接入服务器

首先封装一个输出字符的函数sendString
   

  1. void sendString(char* str)
  2. {
  3. while( *str != '\0'){
  4. sendByte(*str);
  5. str++;
  6. }
  7. }
封装中断函数,接收esp的反馈,由此可以让单片机判断是否输入下一台指令
  1. void Uart_Handler() interrupt 4
  2. {
  3. static int i = 0;//静态变量,被初始化一次
  4. char tmp;
  5. if(RI)//中断处理函数中,对于接收中断的响应
  6. {
  7. RI = 0;//清除接收中断标志位
  8. tmp = SBUF;
  9. if(tmp == 'W' || tmp == 'O' || tmp == 'L' || tmp == 'F'){
  10. i = 0;
  11. }
  12. buffer[i++] = tmp;
  13. //入网成功的判断依据WIFI GOT IP
  14. if(buffer[0] == 'W' && buffer[5] == 'G'){
  15. AT_Connect_Net_Flag = 1;
  16. memset(buffer, '\0', SIZE);
  17. }
  18. //连接服务器等OK返回值指令的判断
  19. if(buffer[0] == 'O' && buffer[1] == 'K'){
  20. AT_OK_Flag = 1;
  21. memset(buffer, '\0', SIZE);
  22. }
  23. //联网失败出现FAIL字样捕获
  24. if(buffer[0] == 'F' && buffer[1] == 'A'){
  25. for(i=0;i<5;i++){
  26. D5 = 0;
  27. Delay1000ms();
  28. D5 = 1;
  29. Delay1000ms();
  30. }
  31. sendString(RESET);
  32. memset(buffer, '\0', SIZE);
  33. }
  34. //灯控指令
  35. if(buffer[0] == 'L' && buffer[2] == '1'){
  36. D5 = 0;//点亮D5
  37. memset(buffer, '\0', SIZE);
  38. }
  39. if(buffer[0] == 'L' && buffer[2] == '0'){
  40. D5 = 1;//熄灭D5
  41. memset(buffer, '\0', SIZE);
  42. }
  43. if(i == 12) i = 0;
  44. }
  45. }
设置工作模式
  1. AT+CWMODE=1 //1. 是station(设备)模式 2.是AP(路由)模式 3.是双模
  2. OK
以设备模式接入家中路由器配置

AT指令

  1. AT+CWJAP="自家的WiFi名称","自家的WiFi密码" //指令
  2. WIFI CONNECTED //结果
  3. WIFI GOT IP //结果
c代码体现
code char LJWL[]  = "AT+CWJAP=\"自己家WiFi名字\",\"自己家WiFi密码\"\r\n"; //入网指令

sendString输出LJWL,并等待esp反馈

  1. //发送联网AT指令并等待成功
  2. sendString(LJWL);
  3. while(!AT_Connect_Net_Flag);
  4. while(!AT_OK_Flag);
  5. AT_OK_Flag = 0;
  6. AT_Connect_Net_Flag = 0;

这里的 AT_OK_Flag和AT_Connect_Net_Flag 是一个标志位,其初始值为0。用来接收esp的反馈,看看是否发送正确,并正确收到,然后执行下一步,用完之后要归0.出来混迟早要还的哈哈哈哈

这里调用AT讲的比较细,后面我就不赘述啦,直接上代码。

查询IP地址,这个不用单片机来实现(接收了也没啥用),想看ip地址可以用串口助手查看

 然后打开自己的pc网络调试助手(windows终端查询自己连的wifi的ip地址)

终端指令:ipconfig

端口号随意吧

开始接入服务器

AT指令

  1. AT+CIPSTART="TCP","自己的windows端口号",8888 //指令,注意双引号逗号都要半角(英文)输入
  2. CONNECT //结果:成功
  3. OK //结果:成功

c语言体现

code char LJFWQ[] = "AT+CIPSTART=\"TCP\",\"192.168.1.101\",8880\r\n"; //连接服务器指令
  1. //发送连服务器指令并等待成功
  2. sendString(LJFWQ);
  3. while(!AT_OK_Flag);
  4. AT_OK_Flag = 0;
开启透传模式

AT有个很呆的指令,需要自己提前输入要发几个字符,但是开启透传就不用提前说明,想发多大字节就发多大字节,一个字,爽

  1. AT+CIPSEND=4 // 设置即将发送数据的长度 (这里是4个字节)
  2. >CLCA // 看到大于号后,输入消息,CLCA,不要带回车
  3. Response :SEND OK //结果:成功
  4. //注意,这种情况下,每次发送前都要先发送AT+CIPSEND=长度 的指令,再发数据!
  1. AT+CIPMODE=1 //开启透传模式
  2. Response :OK
  3. 退出透传模式
  4. 3.5.6 单片机帮你做这一切
  5. AT+CIPSEND //带回车
  6. Response: > //这个时候随意发送接收数据咯

透传模式,爽!

c代码实现:

char TCMS[]  = "AT+CIPMODE=1\r\n";  //透传指令
  1. //发送透传模式指令并等待成功
  2. sendString(TCMS);
  3. while(!AT_OK_Flag);
  4. AT_OK_Flag = 0;

开始数据传输

char SJCS[]  = "AT+CIPSEND\r\n";	//数据传输开始指令
  1. //发送数据传输指令并等待成功
  2. sendString(SJCS);
  3. while(!AT_OK_Flag);

接下来就可以随意爽了

在透传发送数据过程中,若识别到单独的⼀包数据 “+++”,则退出透传发送。

二,esp8266当成wifi路由器(服务器)

首先设置成路由器模式

  1. //1 配置成双模
  2. AT+CWMODE=2
  3. Response :OK

c代码实现

  1. /1 工作在路由模式
  2. char LYMO[] = "AT+CWMODE=2\r\n";
  3. sendString(LYMO);
  4. while(!AT_OK_Flag);
  5. AT_OK_Flag = 0;

需要使能多连接

  1. //2 使能多链接
  2. AT+CIPMUX=1
  3. Response :OK

c代码实现

  1. //2 使能多链接
  2. char DLJ[] = "AT+CIPMUX=1\r\n";
  3. sendString(DLJ);
  4. while(!AT_OK_Flag);
  5. AT_OK_Flag = 0;

建立TCP接收,点亮标志位

  1. //3 建立TCPServer
  2. AT+CIPSERVER=1 // default port = 333
  3. Response :OK

c代码实现

  1. //3 建立TCPServer
  2. char JLFW[] = "AT+CIPSERVER=1\r\n"; // default port = 333
  3. sendString(JLFW);
  4. while(!Client_Connect_Flag);
  5. AT_OK_Flag = 0;
  6. if(Client_Connect_Flag){
  7. D5 = 0;//点亮D5,代表有客户端接入
  8. }

开始发送数据和接收数据

  1. //4 发送数据
  2. AT+CIPSEND=0,5 // 发送5个字节在连接0通道上
  3. >abcd //输入数据,不带回车
  4. Response :SEND OK
  5. //• 接收数据
  6. +IPD, 0, n: xxxxxxxxxx //+IPD是固定字符串 0是通道,n是数据长度,xxx是数据

c代码实现:

  1. //发送数据
  2. char FSSJ[] = "AT+CIPSEND=0,5\r\n";
  3. //4 发送数据
  4. sendString(FSSJ);
  5. Delay1000ms();
  6. Delay1000ms();
  7. sendString("Hello");
  8. Delay1000ms();
  9. Delay1000ms();

这里不确定esp的发送数据反馈,就用了最简单的延时

最后关闭服务器

  1. //断开连接
  2. AT+CIPCLOSE=0
  3. Response :0, CLOSED OK

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/900142
推荐阅读
相关标签
  

闽ICP备14008679号