这里使用ESP32作为WiFi模块,使用STA模式或者AP模式
目录
前言
二、配置WiFi模式
1.STA模式
2.AP模式
3.AP+STA模式
三、实现ESP32与电脑端通信
ESP32的数据接收与传输
ESP32的完整代码
因为幅频特性题目的任务中要求制作使用WiFi传输的上位机,所以开始学习WiFi模块。这里使用了platform来进行开发,一开始使用了ESP8266但是8266每次掉电代码并不保存,这意味着我每次上电都要重新烧录代码,所以本人转而使用ESP32,二者的写法大同小异。
一、WiFi的三种工作模式
ESP32有三种工作模式:AP模式、STA模式以及AP+STA模式。
简单来说AP模式就是ESP32产生一个WiFi信号,让电脑来连接;STA模式就是ESP32去连接一个已有的WiFi(注意,ESP32和电脑要处于同一局域网下);AP+STA模式就是既产生WiFi又连接WiFi。
代码如下(示例):
#include
//STA版
void connect_wifi_STA(){
Serial.begin(115200);
WiFi.begin(wifi_ssid_STA, wifi_password_STA); //连接WIFI
Serial.print("Connected");
//循环,直到连接成功
while(WiFi.status() != WL_CONNECTED){
Serial.println(".");
delay(500);
}
led_es_on();//我的自定义函数:让led亮
IPAddress local_IP = WiFi.localIP();
Serial.print("WIFI is connected,The local IP address is "); //连接成功提示
Serial.println(local_IP);
}
2.AP模式
代码如下(示例):
#include
//AP版
void connect_wifi_AP(){
Serial.begin(115200);
/*可以再配置其他串口,这里只配置了USB线连接的串口*/
WiFi.softAP(wifi_ssid_AP,wifi_password_AP);
while (WiFi.softAPgetStationNum()==0) { // 等待连接WIFI 直到连接成功 退出循环
Serial.println("Loading...");
delay(50);
}
led_es_on();//我的自定义函数:让led亮
IPAddress local_IP = WiFi.localIP();
Serial.print("WIFI is connected,The local IP address is "); //连接成功提示
Serial.println(local_IP);
}
代码如下(示例):
#include
//AP和STA共存版
void connect_wifi_APandSTA(){
Serial.begin(115200);
WiFi.mode(WIFI_AP_STA);
WiFi.softAPConfig(AP_local_ip, AP_gateway, AP_subnet); //配置软件访问点的网络设置,使其拥有指定的IP地址、网关和子网掩码。
//其他设备就可以连接到该访问点,并与ESP32进行通信。
/**
* 参数一:软AP的本地IP地址。它是一个`IPAddress`类型的变量,表示访问点的IP地址。
* 参数二:软AP的网关地址。它也是一个`IPAddress`类型的变量,表示访问点的网关地址。网关是一个设备,用于将数据从一个网络传输到另一个网络。
* 参数三:软AP的子网掩码。它也是一个`IPAddress`类型的变量,表示访问点的子网掩码。子网掩码用于指定一个IP地址的网络部分和主机部分。
**/
WiFi.softAP(wifi_ssid_AP,wifi_password_AP);
WiFi.begin(wifi_ssid_STA,wifi_ssid_STA);
Serial.println("connecting...");
while(WiFi.status()!=WL_CONNECTED){
Serial.println("Waiting...");
delay(50);
}
led_es_on();
IPAddress local_IP = WiFi.localIP();
Serial.print("WIFI is connected,The local IP address is "); //连接成功提示
Serial.println(local_IP); //输出本地IP地址
}
这里我制作的是在电脑上使用网络调试助手发送相应指令控制stm32上板载led灯亮灭。(ESP32通过串口与STM32进行连接)
我使用ESP32作为客户端,将要连接的电脑做服务端。(这里emm其实WiFi模式和客户端模式服务端模式没什么关系,所以写法都是一样的)
首先要创建客户端对象,将客户端与服务端连接
WiFiClient client = server.available();//创建客户端对象
while (!client.connected())//若未连接到服务端,则客户端进行连接。
{
if (!client.connect(host, tcpPort))//实际上这一步就在连接服务端,如果连接上,该函数返回true
{
Serial.println("connection....");//串口输出
delay(500);
}
}
连接后判断服务端有没有发送数据,或者说客户端有没有接收到数据,如果接收到了数据,则对接收到的数据进行处理。这里为了方便STM32的判断我先把一次读到的数据存到数组里面后面再一起打印。
if (client.connected()){
Serial.println("Connected to client !!! ");
while (client.connected()){
while (client.available()>0) {
data[ind++] = client.read();//将读取到的数据存入字符串
}
ind =0;
if(data[ind]>0){//如果开头不为空则将读取到的字符串打印
lint = data;
client.print(lint);//WiFi打印
Serial.print(lint);
data[ind]=0;
}
}
}
最后是stm32进行数据接收。就是非常简单的串口接收字符串后对字符串进行判断是哪条预设指令,并且执行指令。
#include
//#include
const char* ssid = "FlowerPrayer";//WiFi名称
const char* password = "87663210";//WiFi密码
const char* host = "192.168.73.89";//连接热点后分配给ESP32的IP地址
WiFiServer server(8041); //端口号,范围 0-65535
const int tcpPort = 8041;
//WiFiClient client = server.available();
void setup() {
// put your setup code here, to run once:
int j = 0 ;
Serial.begin(115200);//初始化波特率
delay(1000);
WiFi.mode(WIFI_STA);
WiFi.begin(ssid,password);
Serial.print("\r\nConnecting to ");//serial:串口函数,serial.print:经由串口的打印函数
Serial.print(ssid);
Serial.println("...");
while(WiFi.status()!= WL_CONNECTED){//返回值由WiFi连接状态决定
delay(1000);//while循环每一秒检查一次
Serial.print("Waiting for ");
Serial.print(j++);
Serial.println("s...");
}
//delay(1000);
Serial.println("Mode:STA");
Serial.println("WIFI connected !");
Serial.println("IP adress:");
Serial.println(WiFi.localIP());
}
int ind=0;
char data[100];
String lint="";
void loop() {
// put your main code here, to run repeatedly:
WiFiClient client = server.available();//创建客户端对象
while (!client.connected())//若未连接到服务端,则客户端进行连接。
{
if (!client.connect(host, tcpPort))//实际上这一步就在连接服务端,如果连接上,该函数返回true
{
Serial.println("connection....");//串口输出
delay(500);
}
}
if (client.connected()){
Serial.println("Connected to client !!! ");
while (client.connected()){
while (client.available()>0) {
data[ind++] = client.read();
//Serial.write(client.read());
//client.print(data);
//Serial.print(data);
}
ind =0;
if(data[ind]>0){
lint = data;
client.print(lint);//WiFi打印
Serial.print(lint);
data[ind]=0;
}
}
}
}
后面还要使用esp32进行上位机制作,学到了其他的再往上面贴(懒惰.jpg)