admin管理员组

文章数量:1654379

项目所需材料:

  • stm32f103系列最小系统开发板一块。
  • WiFi模块。
  • 具有WiFi功能的手机及PC机。
  • 达普电池一包(或者学生电源一台)。.
  • 1k电阻4个,杜邦线若干。

一.硬件环境搭建

1.1-----主控芯片采用的是stm32f103c8t6芯片。
1.2----- wifi模块采用ESP8266安可信-12F。
1.3-----通过c8t6的串口2(PA2,PA3)与WiFi模块有线连接。

接线图

  • PB.9 为wifi使能端口。
  • PA.2/PA.3为串口2端口。


按照上图将WiFi的RST、EN等引脚上拉电阻,且与c8t6串口2有线连接即可

二.设备连接

2.1-----首先运行MDK。并且配置好stm32f103c8t6串口2的初始化及中断函数。(可参考正点原子的串口实验例程)

2.2-----由上表模式说明将wifi模块配置为运行模式。
2.3-----将WiFi配置为AP模式,具体步骤如下:

  1. 测试指令:AT

检查WiFi模块是否在线,若是则退出透传,且发送指令 **AT+CIPMODE=0**关闭透传。
退出透传:通过向wifi模块连续发送3个+(每个+号之间 超过10ms,这样认为是连续三次发送+)

  1. 设置工作模式:AT+CWMODE=2

数字1表示为STA模式,只能加入到已有的无线网络
数字2表示AP模式,相当于路由器创建一个无线网络,可让其他的终端连接此网络
数字3表示同时兼容AP和STA模式

  1. 重启模块:AT+RST

此处应延时2~4秒等待WiFi模块重启完成

  1. 配置AP模式无线参数:AT+CWSAP=“WiFi名称”,“WiFi密码”
  2. 检测IP是否获得:AT+CIFSR
  3. 启动多路连接模式:AT+CIPMUX=1
  4. 配置服务器:AT+CIPSERVER=1
  5. 设置服务器超时时间:AT+CIPSTO=时间(单位为s秒)

注意第6,7步完成之后需要延时500ms

2.4-----下载运行后,手机或者笔记本可看见自定义名称的WiFi网络,输入密码即可连接。

串口有线连接 无线网络 WiFi模块 stm32单片机 手机或者PC机

2.5-----由上图知三个设备之间的连接方式。到此步骤我们已经完成了硬件环境配置及基本连接,下面将对数据处理进行讲解。

三.数据处理

  • 序言

     我采用的是正点原子资料包中的网络调试助手。因为之前一直不知道数据传输格式,所以困扰了一下午。最后总结了两种方法。
     方法1:将串口2收到的WiFi数据用串口1打印在串口调试助手上面。
     方法2:直接用MDK软件debug然后将WiFi数据打印出来。(不会的可以参考正点原子stm32视频教程)
     经过实践,个人推荐大家使用方法2,数据观察更直观形象。
    

数据格式说明:
1.wifi数据结尾为\r\n,其ASCII码值为0x0D、0x0A。
2.网络调试助手端数据格式–> 数组第8位为字符逗号(0x2C),
第9位开始为数据长度(以每个数字为一个字节存储),一直到字符冒号(0x3A)结束.
原始数据从数组第(10+数据长度)位开始.

#include "WifiDataDeal.h"

char wifi_data[Max_data_len];//提取数据值
u8 wifi_data_len=0;
u8 flag=0;
/*****************************************************************
*Module Name: LJH_1999
*Module Date:	2019/07/06
*Function: Wifi_Data_parsing(void)
*Description: 对串口2接收到的原始数据进行解析,并且将实际数据提取出来。
*Called By: /*此处为调用WiFi数据的各函数*/
*Input: 无
*Output:  wifi_data[Max_data_len]数组中存储网络调试助手端发送的数据
*Return://函数返回值的说明
*Others://其他说明
*****************************************************************/
void Wifi_Data_parsing()
{
	u8 post=9;//取初始数据位置
	u8 i;
	if(USART2_RX_STA&(1<<15))	//接收到数据
	{	
			wifi_data_len = USART2_RX_BUF[post]-48;
			while(USART2_RX_BUF[++post] != 0x3A)		//求出数据长度(int型)
			{
				wifi_data_len = wifi_data_len*10 + USART2_RX_BUF[post]-48;
			}
			
			for(i=0 ; i<wifi_data_len ; i++)
			{
				wifi_data[i] = USART2_RX_BUF[++post];
			}
			wifi_data[wifi_data_len] = 0;//字符串结束标志
			
			flag = 1;//标志接收到数据
			
			USART2_RX_STA=0;
	}
}

前面提过,串口接收到的数据其长度值以十六进制从数组的第9位开始存储,直到遇见字符冒号(0x3A)截止。故开始先从原始数据的第九位开始去获取本次数据的长度wifi_data_len,再从字符冒号之后开始**取实际数据**。(例如:数据长度为2,则原始数据第九位为0x32,实际数据从第11位开始;数据长度为12,则原始数据第九位为0x31,第十位为0x32,实际数据从第12位开始;其他情况以此类推)

注:
1.wifi_data_len = USART2_RX_BUF[post]-48;一句中减轻48是因为字符0其十进制表示为48,故此语句是将字符型数字转化为int整型数据。
2.在数据提取完成之后一定要在最后加一个0;否则数据拿去进行字符串判断时可能会出错。

四.附表及项目资料包

资料包的密码为:wifi
请点击此处转到百度云盘下载提取码为e89i


本文标签: 无线通信串口单片机模块项目