【stm32f429igt6】的WiFi模块数据收发。
主要模块:串口7 、串口3 esp8266 stm429igt6、网络调试助手、串口助手。
个人对上图的理解哈! 1:u3和WiFi是一对情侣 串口三有一个收发数组。例如,我们需要通过传感器收集到的数据WiFi将模块发送到远端。将收集到的数据存储在串口3的数组中,WiFi模块将自动发送数组中的数据。当WiFi将收到的数据交给单片机进行交互,WiFi将收到的数据放入串口3的数组中,然后在单片机代码中读取数组OK了。
2:u7.单片机和串口助手,串口7printf函数在串口助手上可视化数据。
我们从main函数一步一步走吧!
int main(void) {
u8 data[32]; //my_mem_init(SRAMIN); ////内部内存池的初始化 //my_mem_init(SRAMCCM); ///内部初始化CCM内存池 HAL_Init(); //初始化HAL库 sys_clock_init(360,25,2,8); //设置时钟,180Mhz delay_init(180); //初始化延迟函数 adc_init(); led_init(); //初始化LED uart7_init(4800); //初始化USART usart3_init(115200); //初始化USART TIM3_Init(100-1,900-1); ///定时器3初始化,定时器时钟90M,900-1的分频系数, EXTILine6_9_Config(); printf("test"); //atk_8266_wifista_test(); wifi_sta_tcp_client_connect();//wifi 连接 while(1) {
wifi_data_send("lihua");//wifi发送数据给网络助手
delay_ms(100);
delay_ms(500);
wifi_data_receive(data); //wifi接受数据 ,wifi模块将信息存进数组。
delay_ms(100);
}
wifi_connect_confirm();//确认连接状态并重新连接
}
上面main函数中wifi_sta_tcp_client_connect(); //wifi 连接
这个函数是发送AT指令的。里面的在common.c中,所以只要看并修改common.c的代码就好了
void wifi_sta_tcp_client_connect(void)
{
u8 ipbuf[16]; //IP缓存
u8 *p;
u8 a[32];
p=a; //申请32字节内存
atk_8266_send_cmd("AT+CWMODE=1","OK",50); //设置WIFI STA模式
delay_ms(1000); //延时4S等待重启成功
delay_ms(1000);
delay_ms(1000);
delay_ms(1000);
//设置连接到的WIFI网络名称/加密方式/密码,这几个参数需要根据您自己的路由器设置进行修改!!
sprintf((char*)p,"AT+CWJAP=\"%s\",\"%s\"",wifista_ssid,wifista_password);
//连接目标路由器,并获得IP
printf("正在连接路由\r\n");
atk_8266_send_cmd(p,"WIFI GOT IP",1000);
//检测是否获得STA IP
while(atk_8266_send_cmd("AT+CIFSR","STAIP",20));
atk_8266_send_cmd("AT+CIPMUX=0","OK",20); //0:单连接,1:多连接
printf("路由已连接\r\n");
sprintf((char*)p,"AT+CIPSTART=\"TCP\",\"%s\",%s",server_ip,server_port);
while(atk_8266_send_cmd(p,"OK",200))
{
LED3=!LED3;
printf("ATK-ESP 连接TCP失败\r\n");
}
LED3=1;
atk_8266_send_cmd("AT+CIPMODE=1","OK",200); //传输模式为:透传
atk_8266_get_wanip(ipbuf); //服务器模式,获取WAN IP
USART3_RX_STA=0;
}
common.c(这是一部分,我相信大家都因该有完整代码。)
关键参数, 1:你连接的路由器SSID号(WiFi名字)和密码,这里可以看注释 2:你的物理机和esp8266连接同一个WiFi后的物理机ip和端口 (这个会被用在网络助手的参数选择上)配置好后给上面wifi_sta_tcp_client_connect();使用
//WIFI 透传,服务器地址. const u8* server_ip=“192.168.1.141”; const u8* server_port=“8081”;
//用户配置区
//连接端口号:8081,可自行修改为其他端口.
const u8* portnum="8082";
//WIFI STA模式,设置要去连接的路由器无线参数,请根据你自己的路由器设置,自行修改.
const u8* wifista_ssid="ChinaNet-EM102"; //路由器SSID号
const u8* wifista_encryption="wpawpa2_aes";//wpa/wpa2 aes加密方式
const u8* wifista_password="wearefamily"; //连接密码
//WIFI AP模式,模块对外的无线参数,可自行修改.
const u8* wifiap_ssid="ESP13"; //对外SSID号
const u8* wifiap_encryption="wpawpa2_aes"; //wpa/wpa2 aes加密方式
const u8* wifiap_password="12345678"; //连接密码
//WIFI 透传,服务器地址.
const u8* server_ip="192.168.1.141";
const u8* server_port="8081";
//4个网络模式
const u8 *ATK_ESP8266_CWMODE_TBL[3]={
"STA模式 ","AP模式 ","AP&STA模式 "}; //ATK-ESP8266,3种网络模式,默认为路由器(ROUTER)模式
//4种工作模式
const u8 *ATK_ESP8266_WORKMODE_TBL[3]={
"TCP服务器","TCP客户端"," UDP 模式"}; //ATK-ESP8266,4种工作模式
//5种加密方式
const u8 *ATK_ESP8266_ECN_TBL[5]={
"OPEN","WEP","WPA_PSK","WPA2_PSK","WPA_WAP2_PSK"};
common.c中的 atk_8266_send_data()
这个函数封装了u3_printf()将data发送到WiFi模块然后模块发给网络助手(这里当服务器)。
u8 atk_8266_send_data(u8 *data,u8 *ack,u16 waittime)
{
u8 res=0;
USART3_RX_STA=0;
u3_printf("%s",data); //发送命令
if(ack&&waittime) //需要等待应答
{
while(--waittime) //等待倒计时
{
delay_ms(10);
if(USART3_RX_STA&0X8000) //接收到期待的应答结果
{
if(atk_8266_check_cmd(ack))break;//得到有效数据
USART3_RX_STA=0;
}
}
if(waittime==0)res=1;
}
return res;
}
common.c中的 atk_8266_send_cmd()
一条AT指令ESP8266就解析指令然后再开展下一步操作。所以我们发送数据前都先发AT指令。相应的应答我也不是很懂。
u8 atk_8266_send_cmd(u8 *cmd,u8 *ack,u16 waittime)
{
u8 res=0;
USART3_RX_STA=0;
u3_printf("%s\r\n",cmd); //发送命令
if(ack&&waittime) //需要等待应答
{
while(--waittime) //等待倒计时
{
delay_ms(20);
if(USART3_RX_STA&0X8000) //接收到期待的应答结果
{
if(atk_8266_check_cmd(ack))
{
//printf("ok");
break; //得到有效数据
}
USART3_RX_STA=0;
}
}
if(waittime==0)res=1;
}
return res;
}
总结
WiFi模块和单片机是两个事! 单片机的代码不是在WiFi上跑的。所以你看到的都是交互都是基于串口3将单片机和WiFi模快连接。
代码中的什么WiFi发送和接收函数(看英文就ok了)都是使用数组中的数据。
1.设置WIFI 模式为 Station:AT+CWMODE=1 2.连接到家中路由器:AT+CWJAP=“liuyao”,“liuyao1001” 3.发送AT指令建立 TCP 连接:AT+CIPSTART=“TCP”,“192.168.0.103”,8080 4.开启透传模式:AT+CIPMODE=1 5.开始透传发送:AT+CIPSEND 6.串口调试助手发送:hello I m TCP Client! 7.网络调试助手发送:hello I m TCP Server!