一、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 指令以回车作为结 尾,响应或上报以回车换行为结尾。
AT指令简单来说:就是终端设备(单片机)向终端适配器(PC机)发送指令,目的是,请求驱动我们的终端适配器(PC机)干活,比如说联网,比如说数据传输等。
二、初始wifi模块配置和验证
连接前的东西准备:wifi模块、usb转ttl串口工具
线的连接方式
wifi模块的RXD接到usb转ttl串口工具上的TXD上(交叉接线)
wifi模块的TXD接到usb转ttl串口工具上的RXD上(交叉接线)
wifi模块的正极、负极接到usb转ttl串口工具的正极、负极
通过一下命令配置成9600波特率,本人是使用安信可串口调试助手进行调试的
AT+UART=9600 8 1 0 0
重启wifi模块命令
AT+RST
三、wifi模块入网设置
设置工作模式
AT+CWMODE=3 //1. 是 station (设备)模式 2. 是 AP (路由)模式 3. 是双模
以设备模式接入家中路由器配置
AT+CWJAP="要连接的wifi名字","要连接的wifi密码"
AT+CWJAP="ChinaUnicom-G43PQG","123456789"----->这个是我自己配置的wifi
连接成功提示
WIFI DISCONNECT
WIFI CONNECTED
WIFI GOT IP
OK
查询 IP 地址
AT+CIFSR
查询结果
AT+CIFSR
+CIFSR:APIP,"192.168.4.1"
+CIFSR:APMAC,"be:ff:4d:4a:d8:73"
+CIFSR:STAIP,"192.168.101.245" ----->一般IP地址是这个(这个是我自己用的IP地址哈)
+CIFSR:STAMAC,"bc:ff:4d:4a:d8:73"
OK
四、wifi模块连接到 TCP server(服务器)
打开网络调试助手工具
连接服务器
192.168.101.178:为自己电脑本地的IP地址
8880:为上一步设置的本地主机端口号
打开串口工具,把命令输入到下方的串口调试助手中
AT+CIPSTART="TCP","192.168.101.178",8880
发送数据
AT+CIPSEND = 4 // 设置即将发送数据的长度 (这里是 4 个字节)
> CLCA // 看到大于号后,输入消息, CLCA ,不要带回车
Response : SEND OK // 结果:成功
// 注意,这种情况下,每次发送前都要先发送 AT+CIPSEND= 长度 的指令,再发数据
注意:输入发送数据命令时,要勾选"发送新行",当真正发送数据时,要取消"发送新行"的勾选
透传
上一节每次发送数据都要进行字符长度设定,如果设置成透传,就有点像蓝牙模块的玩法
AT+CIPMODE=1 // 开启透传模式
Response : OK
AT+CIPSEND // 开启数据传输
Response : > // 这个时候随意发送接收数据咯
退出透传模式
先取消"发送新行"勾选,然后在发送行输入“+++”,连续点击发送两次,则退出透传发送
五、通过单片机向wifi模块发送AT指令
编写发送AT指令代码
#include "reg52.h"
#include <stdio.h>
#include <string.h>
#define SIZE 12
sbit D5 = P3^7;
sfr AUXR = 0x8E;
char cmd[SIZE];
code char LJWL[] = "AT+CWJAP=\"ChinaUnicom-G43PQG\",\"123456789\"\r\n"; //连接wifi
code char LJFWQ[] = "AT+CIPSTART=\"TCP\",\"192.168.101.178\",8880\r\n"; //连接服务器
char TCMS[] = "AT+CIPMODE=1\r\n"; //开启透传模式
char SJCS[] = "AT+CIPSEND\r\n"; //开启数据传输
void UartInit(void) //9600bps@11.0592MHz
{
AUXR = 0x01; //降低时钟对外界的辐射
SCON = 0x50; //串行口寄存器工作模式选择方式1,RNE=1,为串行允许接收状态
TMOD &= 0x0F; //定时器1工作方式位8位自动重装
TMOD |= 0x20;
TH1 = 0xFD;
TL1 = 0xFD; //9600波特率的初值
TR1 = 1; //启动定时器
EA = 1; //总中断寄存器,开启总中断
ES = 1; //开启串口中断
}
void Delay1000ms() //@11.0592MHz
{
unsigned char i, j, k;
i = 8;
j = 1;
k = 243;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void Delay10ms() //@11.0592MHz
{
unsigned char i, j;
i = 18;
j = 235;
do
{
while (--j);
} while (--i);
}
void sendByte(char data_msg){
SBUF = data_msg;
while(!TI); //智能延时,靠硬件延时
TI = 0;
}
void sendString(char* str){
while(*str != '\0'){
sendByte(*str);
str++;
}
}
void main()
{
D5 = 1;
//配置C51串口的通信方式
UartInit();
while(1){
Delay1000ms();
//往发送缓冲区写入数据,就完成数据的发送
sendString("hello world !\r\n");
sendString(LJWL);
Delay1000ms();
Delay1000ms();
Delay1000ms();
Delay1000ms();
Delay1000ms();
sendString(LJFWQ);
Delay1000ms();
Delay1000ms();
Delay1000ms();
Delay1000ms();
Delay1000ms();
sendString(TCMS);
Delay1000ms();
Delay1000ms();
Delay1000ms();
Delay1000ms();
Delay1000ms();
sendString(SJCS);
Delay1000ms();
Delay1000ms();
Delay1000ms();
Delay1000ms();
Delay1000ms();
}
}
void Uart_Handler() interrupt 4
{
static int i = 0; //静态变量,被初始化一次
if(RI == 1){ //中断处理函数中,对于接收中断的响应
RI = 0; //清除接收中断标志位
cmd[i] = SBUF;
i++;
if(i == SIZE){
i = 0;
}
if(strstr(cmd,"en")){
D5 = 0; //点亮D5
i = 0;
memset(cmd,'\0',SIZE);
}
if(strstr(cmd,"se")){
D5 = 1; //熄灭D5
i = 0;
memset(cmd,'\0',SIZE);
}
}
if(TI);
}
验证上述代码,把代码烧录到单片机中,验证单片机通过串口发送AT指令,如下图所示,单片机通过串口发送AT指令成功
单片机向wifi模块发送AT指令,wifi模块再向串口发送AT指令
连接前的东西准备:C51单片机、wifi模块、usb转ttl串口工具
接线方式:
C51单片机的TXD线接到wifi模块的RXD线上
wifi模块的TXD线接到usb转ttl串口工具的RXD线上
C51单片机的正极、负极与wifi模块的正极、负极相连
模拟连接图
实物连接图
单片机向wifi模块发送数据,wifi模块接收到数据后,再向usb转ttl串口发送数据,因为usb转ttl串口接到了PC机上,所以用电脑打开串口工具,来查看接收到的数据
由上述结果得知:wifi模块成功被C51单片机驱动起来了