问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

蓝牙串口模块、初识AT命令、WiFi模块、WiFi模块使用和编程

创作时间:
作者:
@小白创作中心

蓝牙串口模块、初识AT命令、WiFi模块、WiFi模块使用和编程

引用
CSDN
1.
https://blog.csdn.net/weixin_45650620/article/details/137336401

本文将介绍蓝牙串口模块、AT命令以及WiFi模块(以ESP-01s为例)的使用和编程。主要内容包括串口透传技术、AT指令的定义及其使用方法,并通过具体的AT指令示例展示了如何配置WiFi模块的波特率、连接模式、接入路由器、查询IP地址、连接TCP服务器等操作。此外,文章还提供了两个具体的代码示例,分别演示了如何通过单片机发送AT指令来连接WiFi模块和如何配置ESP-01s作为服务器。

蓝牙模块

蓝牙模块,又叫做蓝牙串口模块。

串口透传技术:
透传即透明传送,是指在数据的传输过程中,通过无线的方式这组数据不发生任何形式的改变,仿佛传输过程是透明的一样,同时保证传输的质量,原封不动地到了最终接收者手里。

以太网,蓝牙,Zigbee, GPRS 等模块玩法一样,对嵌入式程序员来说,不需要关心通讯模块内部数据及协议栈工作原理,只要通过串口编程获得数据即可

WiFi模块-ESP-01s

蓝牙,ESP-01s,Zigbee, NB-Iot等通信模块都是基于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指令测试通信及模块功能是否正常


AT
OK

通过一下命令配置成9600波特率


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

入网设置


AT+CWMODE=3 //1. 是station(设备)模式 2.是AP(路由)模式 3.是双模
OK

以设备模式接入家中路由器配置


AT+CWJAP="WIFI名","WIFI密码"//指令
WIFI CONNECTED //结果
WIFI GOT IP //结果

查询IP地址


AT+CIFSR //指令
+CIFSR:APIP,"192.168.4.1"
+CIFSR:APMAC,"4e:75:25:0d:ae:2f"
+CIFSR:STAIP,"192.168.0.148"
+CIFSR:STAMAC,"4c:75:25:0d:ae:2f"
OK

连接到 TCP server

  1. 开关网络助手,设立TCP服务器
  2. 连接服务器

AT+CIPSTART="TCP","192.168.0.113",8888 //指令,注意双引号逗号都要半角(英文)输入
CONNECT //结果:成功
OK //结果:成功
  1. 发送数据

AT+CIPSEND=4 // 设置即将发送数据的长度 (这里是4个字节)
>CLCA // 看到大于号后,输入消息,CLCA,不要带回车
Response :SEND OK //结果:成功
//注意,这种情况下,每次发送前都要先发送AT+CIPSEND=长度 的指令,再发数据!

透传
上一节每次发送数据都要进行字符长度设定,如果设置成透传,就有点像蓝牙模块的玩法


AT+CIPMODE=1 //开启透传模式
Response :OK
AT+CIPSEND //带回车
Response: >   //这个时候随意发送接收数据咯

退出透传模式


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

代码


/*
单片机通过发送AT指令来连接WIFI模块
*/
#include "reg52.h"
#include "intrins.h"
#include "string.h"
#define SIZE 12
sfr AUXR = 0x8E;
sbit D5 = P3^7;
sbit D6 = P3^6;
int Wifi_gotip = 0;
int At_ok = 0;
char buff[SIZE];
code char Connect_Network[] = "AT+CWJAP=\"YXS1017\",\"yuanxueshe1017\"\r\n";//连接网络
code char Connect_server[]  = "AT+CIPSTART=\"TCP\",\"192.168.1.58\",8880\r\n";//连接服务器
char Transparent_mode[] = "AT+CIPMODE=1\r\n";//透传模式
char Transferring_data[] = "AT+CIPSEND\r\n";//传输数据
void Delay1000ms()		//@11.0592MHz
{
    unsigned char i, j, k;
    _nop_();
    i = 8;
    j = 1;
    k = 243;
    do
    {
        do
        {
            while (--k);
        } while (--j);
    } while (--i);
}
void UartInit(void)		//9600bps@11.0592MHz
{
    AUXR = 0x01;//提升系统EMI性能
    PCON = 0x00;//SMOD0 = 0时SCON中的SM0,和SM1一起指定串行口的工作方式
    SCON = 0x50;//串口工作方式1,且REN=0,允许串口接收
    
    TMOD &= 0x0F;
    TMOD |= 0x20;//定时器1的工作方式8位自动重装
    
    TH1 = 0xFD;
    TL1 = 0xFD;//9600bps的TH1初值
    TR1 = 1;//启动定时器
    
    EA = 1;//开启总中断
    ES = 1;//开启串口中断
}
void send_byte(char data_msg)
{
    SBUF = data_msg;
    while(!TI);
    TI = 0;
}
void send_str(char* data_msg)
{
    while(*data_msg != '\0'){
        send_byte(*data_msg);
        data_msg++;
    }
}
void main()
{
    Delay1000ms();//延时 模块上电
    D6 = 1;
    D5 = 1;
    UartInit();//led和串口初始化
    send_str(Connect_Network);
    while(!Wifi_gotip);//接收AT指令的返回值
    Wifi_gotip = 0;
    while(!At_ok);//接收AT指令的返回值
    At_ok = 0;//重复利用OK,将OK标志清零
    send_str(Connect_server);
    while(!At_ok);//接收AT指令的返回值
    At_ok = 0;
    send_str(Transparent_mode);
    while(!At_ok);//接收AT指令的返回值
    At_ok = 0;
    send_str(Transferring_data);
    while(1){
            send_str("to be number one\r\n");//心跳包
            Delay1000ms();
    }
    
}
void uart_handler() interrupt 4
{
    static i = 0;//静态变量
    char tmp;//判断关键字符
    if(RI){
        RI = 0;
        tmp = SBUF;
        if(tmp == 'W' || tmp == 'O' || tmp == 'D'){//抓取关键字
            i = 0;
        }
        buff[i] = tmp;
        i++;
        //根据白盒测试出,AT指令的返回字,抓取其中的关键字来判断单片机接收到的信息
        if(buff[0] == 'W' && buff[5] == 'G'){//入网成功的判断依据WIFI GOT IP
            Wifi_gotip = 1;
            memset(buff,'\0',SIZE);
        }
        if(buff[0] == 'O' && buff[1] == 'K'){//连接服务器等OK返回值指令的判断
            At_ok = 1;
            memset(buff,'\0',SIZE);
        }
        if(buff[0] == 'D' && buff[2] == '5'){//通过串口助手输入D5和D6来控制led
            D5 = !D5 ;
            memset(buff,'\0',SIZE);
        }
        if(buff[0] == 'D' && buff[2] == '6'){
            D6 = !D6; 
            memset(buff,'\0',SIZE);
        }
        if(i == 12) i = 0;
    }
    if(TI);
}

ESP-01s当服务器

USB转TTL插入电脑,TX–RX RX-TX VCC-3.3V GDN-GND
查询IP地址:AT+CIFSR

  1. 配置成路由模式

AT+CWMODE=2
Response :OK
  1. 使能多链接

AT+CIPMUX=1
Response :OK
  1. 建立TCPServer

AT+CIPSERVER=1 //默认port:333
Response :OK
  1. 发送数据

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

代码


//ESP-01s工作在路由模式,课程查询路由器IP地址192.168.4.1,使用的服务器默认端口号333
//ESP-01s收到数据D5,D6给上官一号,实现ledD5和ledD6的亮/灭
#include "reg52.h"
#include "intrins.h"
#include "string.h"
#define SIZE 12
sfr AUXR = 0x8E;
sbit D5 = P3^7;
sbit D6 = P3^6;
//int Wifi_gotip = 0;
int Connect = 0;
int At_ok = 0;
char buff[SIZE];
char Routing_mode[] = "AT+CWMODE=2\r\n";//设置ESP8266为路由模式
char Enable_connections[] = "AT+CIPMUX=1\r\n";//使能多连接
char Establish_TCPserver[] = "AT+CIPSERVER=1\r\n";//建立TCP服务器
char Send_data[] = "AT+CIPSEND=0,5\r\n";//在0通道上发送5个字节
void Delay1000ms()		//@11.0592MHz
{
    unsigned char i, j, k;
    _nop_();
    i = 8;
    j = 1;
    k = 243;
    do
    {
        do
        {
            while (--k);
        } while (--j);
    } while (--i);
}
void UartInit(void)		//9600bps@11.0592MHz
{
    AUXR = 0x01;//提升系统EMI性能
    PCON = 0x00;//SMOD0 = 0时SCON中的SM0,和SM1一起指定串行口的工作方式
    SCON = 0x50;//串口工作方式1,且REN=0,允许串口接收
    
    TMOD &= 0x0F;
    TMOD |= 0x20;//定时器1的工作方式8位自动重装
    
    TH1 = 0xFD;
    TL1 = 0xFD;//9600bps的TH1初值
    TR1 = 1;//启动定时器
    
    EA = 1;//开启总中断
    ES = 1;//开启串口中断
}
void send_byte(char data_msg)
{
    SBUF = data_msg;
    while(!TI);
    TI = 0;
}
void send_str(char* data_msg)
{
    while(*data_msg != '\0'){
        send_byte(*data_msg);
        data_msg++;
    }
}
void main()
{
    Delay1000ms();//延时 模块上电
    D6 = 1;
    D5 = 1;
    UartInit();//led和串口初始化
    send_str(Routing_mode);//工作在路由模式
    while(!At_ok);
    At_ok = 0;
    send_str(Enable_connections);//使能多链接
    while(!At_ok);
    At_ok = 0;
    send_str(Establish_TCPserver);//建立TCPServer
    while(!Connect);
    if(Connect){
        D5 =0;
        D6 =0;//如果连接上服务器,D5和D6同时亮
    }
    while(1){
        send_str(Send_data);//发送数据
        Delay1000ms();
        Delay1000ms();
        send_str("HELLO");
        Delay1000ms();
        Delay1000ms();
    }
    
}
void uart_handler() interrupt 4
{
    static i = 0;//静态变量
    char tmp;//判断关键字符
    if(RI){
        RI = 0;
        tmp = SBUF;
        if(tmp == '0' || tmp == 'O' || tmp == ':'){
            i = 0;
        }
        buff[i] = tmp;
        i++;
        if(buff[0] == '0' && buff[2] == 'C'){//连接网络判断0,CONNECT
            Connect = 1;
            memset(buff,'\0',SIZE);
        }
        if(buff[0] == 'O' && buff[1] == 'K'){//连接服务器等OK返回值指令的判断
            At_ok = 1;
            memset(buff,'\0',SIZE);
        }
        if(buff[0] == ':' && buff[2] == '5'){//灯控指令,判断":D5"和":D6"
            D5 = !D5 ;
            memset(buff,'\0',SIZE);
        }
        if(buff[0] == ':' && buff[2] == '6'){
            D6 = !D6; 
            memset(buff,'\0',SIZE);
        }
        if(i == 12) i = 0;
    }
    if(TI);
}

本文原文来自CSDN

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号