蓝牙模块
- 蓝牙模块,又叫做蓝牙串口模块。
-
串口透传技术:
透传即透明传送,是指在数据的传输过程中,通过无线的方式这组数据不发生任何形式的改变,仿佛传输过程是透明的一样,同时保证传输的质量,原封不动地到了最终接收者手里。
以太网,蓝牙,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指令测试通信及模块功能是否正常
ATOK
-
通过一下命令配置成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
-
开关网络助手,设立TCP服务器
-
连接服务器
AT+CIPSTART="TCP","192.168.0.113",8888 //指令,注意双引号逗号都要半角(英文)输入 CONNECT //结果:成功 OK //结果:成功
-
发送数据
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 IPWifi_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来控制ledD5 = !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
-
配置成路由模式
AT+CWMODE=2 Response :OK
-
使能多链接
AT+CIPMUX=1 Response :OK
-
建立TCPServer
AT+CIPSERVER=1 //默认port:333 Response :OK
-
发送数据
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);//建立TCPServerwhile(!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,CONNECTConnect = 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); }