目录
- 注意事项
- 获取AT指令
- 用到的指令
- 通过返回的指令提取自己想要的信息
注意事项
- 转义字符:“ \ ” :C中定义了一些字母前加""来表示常见的那些不能显示的ASCII字符,如\0,\t,\n等,就称为转义字符,因为后面的字符,都不是它本来的ASCII字符意思了。简单来说就是在一些字符前加 “\” 使它具有其他意义。
- 分开处理AT指令的程序和发送AT指令的程序,避免在空等WiFi模块返回指令。可以用switch…case函数来写,网上很多例程都是等待返回的,移植到主程序运行会消耗很多时间,而且其他功能还不能用,要等连上网才能用。
- &:取地址符号。
获取AT指令
- 可以到乐鑫该官网找,链接: 命令集
- 或者找模块商城客服要一份PDF,不同固件对指令的支持不一样;
用到的指令
注意:除了退出透传指令,发送其他指令都要在后面添加“\r\n”
- 测试AT启动:AT
- 退出透传模式:+++
- 设置工作模式为WiFi模式:AT+CWMODE=1
- 重启:AT+RST
- 连接WiFi:AT+CWJAP=“WiFi名称”,“WiFi密码”
- 获取信号强度:AT+CWJAP?
返回的报文中,带负号“-”的数字就是信号强度。
其范围为零到负一百:0 ~-100
数字越大,代表信号越强。 - 查询MAC地址:AT+CIPSTAMAC?
- 查询本地IP、网关和子网掩码:AT+CIPSTA?
- 查询DNS地址:AT+CIPDNS_CUR?
有些固件不支持这条指令。 - 禁用多连接:AT+CIPMUX=0
- 连接服务器:AT+CIPSTART=“TCP”,“服务器地址”,端口号
- 开启透传模式:AT+CIPMODE=1
- 透传模式下发送数据:AT+CIPSEND
这样就可以直接发送数据了,发送指令WiFi模块也不会响应,要发送退出透传模式指令才会对AT指令有反应。
通过返回的指令提取自己想要的信息
- 提取信号强度
#include "stdlib.h"
char *ESP_RSSI = NULL;//接收字符串
int RSSI = -1;
void Compare_RSSI(void)//比较信号强度
{
if(RSSI <= 0 && RSSI >= -55)
{
m_atrssi = BEST;//信号强度最好
}
else if(RSSI < -55 && RSSI >= -70)
{
m_atrssi = BETTER;//信号强度较好
}
else if(RSSI < -70 && RSSI >= -85)
{
m_atrssi = GENERAL;//信号强度一般
}
else if(RSSI<-85 && RSSI >=-100)
{
m_atrssi = BAD;//信号强度差
}
}
void RSSI(void)// 提取信号强度
{
ESP_RSSI = strstr((char *)RX_BUF,"+CWJAP:");
ESP_RSSI = strstr((char *)ESP_RSSI + 1,",");
ESP_RSSI = strstr((char *)ESP_RSSI + 1,",");
ESP_RSSI = strstr((char *)ESP_RSSI + 1,",");
RSSI = atoi(ESP_RSSI + 1);//把字符串转换成整型数
//判断级别
Compare_RSSI();//判断信号强度
}
参考博客
- 提取MAC地址
#include “stdio.h”
const char s[2] = "\"";//间隔符 ” 一个双引号字符需要转运符号加 “\”
char *ESP_MAC1;
char *ESP_MAC2;
uint8_t ESP_MAC[12] = {0};//MAC地址
void MAC(void)//提取MAC地址
{
int a = 0;
ESP_MAC1= strtok((char *)Array,s);//分解接收到的字符串,分隔符为 ”
while(ESP_MAC1!= NULL)//若未分割完成
{
a++;
if(a == 2)//提取MAC地址
{
ESP_MAC2= ESP_MAC1;
}
ESP_MAC1= strtok(NULL,s);
}
sscanf((const char *)ESP_MAC2,"%c%c:%c%c:%c%c:%c%c:%c%c:%c%c",&ESP_MAC[0],&ESP_MAC[1],&ESP_MAC[2],&ESP_MAC[3],&ESP_MAC[4],&ESP_MAC[5],&ESP_MAC[6],&ESP_MAC[7],&ESP_MAC[8],&ESP_MAC[9],&ESP_MAC[10],&ESP_MAC[11]);
}
- 提取本地IP、网关和子网掩码
#include “stdio.h”
char *ESP_MAC1;
char *ESP_IP;
char *ESP_GW;
char *ESP_NM;
int ESP_Local_IP[4] = {0};//本地IP
int ESP_Gateway[4] = {0};//网关
int ESP_Netmask[4] = {0};//子网掩码
int ESP_DNS[4] = {0};//DNS地址
void Save_IP(void)//存本地IP
{
int a = 0;
ESP_MAC1= strtok((char *)RX_BUF,s);//分解接收到的字符串,分隔符为 ”
while(ESP_MAC1!= NULL)//若未分割完成
{
a++;
if(a == 2)//提取本地IP
{
ESP_IP= ESP_MAC1;
}
else if(a == 4)//提取网关
{
ESP_GW= ESP_MAC1;
}
else if(a == 6)//提取子网掩码
{
ESP_NM= ESP_MAC1;
}
ESP_MAC1= strtok(NULL,s);
}
sscanf((const char *)ESP_IP,"%d.%d.%d.%d",&ESP_Local_IP[0],&ESP_Local_IP[1],&ESP_Local_IP[2],&ESP_Local_IP[3]);
sscanf((const char *)ESP_GW,"%d.%d.%d.%d",&ESP_Gateway[0],&ESP_Gateway[1],&ESP_Gateway[2],&ESP_Gateway[3]);
sscanf((const char *)ESP_NM,"%d.%d.%d.%d",&ESP_Netmask[0],&ESP_Netmask[1],&ESP_Netmask[2],&ESP_Netmask[3]);
}