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

本文详细介绍了如何通过AT指令操作ESP-01s蓝牙模块,包括设置波特率、入网、连接路由器、TCP服务器连接以及数据透传,展示了如何在嵌入式程序中利用这些模块进行简单的网络通信。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

蓝牙模块

  • 蓝牙模块,又叫做蓝牙串口模块。
  • 串口透传技术:

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

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

    在这里插入图片描述

WiFi模块-ESP-01s

  • 蓝牙,ESP-01s,Zigbee, NB-Iot等通信模块都是基于AT指令的设计
  • 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 //结果:成功
      
    3. 发送数据

      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
      
    2. 使能多链接

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

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

      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);
    }
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值