1、主程序
void app_main(void)
{
//Initialize NVS
esp_err_t ret = nvs_flash_init()
if (ret == ESP_ERR_NVS_NO_FREE_PAGES || ret == ESP_ERR_NVS_NEW_VERSION_FOUND) {
ESP_ERROR_CHECK(nvs_flash_erase())
ret = nvs_flash_init()
}
ESP_ERROR_CHECK(ret)
ESP_LOGI(TAG, "ESP_WIFI_MODE_STA!!!!")
wifi_init_sta()
}
1
2
3
4
5
6
7
8
9
10
11
12
13
1
2
3
4
5
6
7
8
9
10
11
12
13
在main函数中对nvs进行初始化用于保存路由器信息,然后进桐洞入wifi_init_sta()函数连接到路由器
2、WiFi连接函数
WiFi连接函数大致分为三个阶段:1. Wi-Fi/LwIP 初始化阶段;2. Wi-Fi 配置阶段;3. Wi-Fi 启动阶段
具体过程在相关函数后注释了一些,细节还是看看乐鑫文档
void wifi_init_sta(void)
{
s_wifi_event_group = xEventGroupCreate()
//1. Wi-Fi/LwIP 初始化阶段
ESP_ERROR_CHECK(esp_netif_init())//初始化LwIP,创建LwIP核心任务并初始化与LwIP相关的工作。
printf("sequence1.\n")
ESP_ERROR_CHECK(esp_event_loop_create_default())//创建一个系统事件任务,并初始化应用程序事件的回调函局备枯数
esp_netif_create_default_wifi_sta()//创建有 TCP/IP 堆栈的默认网络接口实例绑定 station
printf("sequence2.\n")
wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT()
ESP_ERROR_CHECK(esp_wifi_init(&cfg))//创建 Wi-Fi 驱动程序任务,并初始化 Wi-Fi 驱动程序
printf("sequence3.\n")
//创建应用程序任务,应用程序可以在使用进行注册的回调中处理这些事件esp_event_handler_register()
esp_event_handler_instance_t instance_any_id
esp_event_handler_instance_t instance_got_ip
ESP_ERROR_CHECK(esp_event_handler_instance_register(WIFI_EVENT,
ESP_EVENT_ANY_ID,
&event_handler,
NULL,
&instance_any_id))
ESP_ERROR_CHECK(esp_event_handler_instance_register(IP_EVENT,
IP_EVENT_STA_GOT_IP,
&event_handler,
NULL,
&instance_got_ip))
printf("sequence4.\n")
//2. Wi-Fi 配置阶段
wifi_config_t wifi_config = {
.sta = {
.ssid = EXAMPLE_ESP_WIFI_SSID,
.password = EXAMPLE_ESP_WIFI_PASS,
/* Setting a password implies station will connect to all security modes including WEP/WPA.
* However these modes are deprecated and not advisable to be used. Incase your Access point
* doesn't support WPA2, these mode can be enabled by commenting below line */
.threshold.authmode = WIFI_AUTH_WPA2_PSK,
.pmf_cfg = {
.capable = true,
.required = false
},
},
}
printf("sequence5.\n")
ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_STA) )//设置wifi模式
ESP_ERROR_CHECK(esp_wifi_set_config(WIFI_IF_STA, &wifi_config) )//配置wifi接口的参数
ESP_ERROR_CHECK(esp_wifi_start() )//3. Wi-Fi 启动阶段
//Wi-Fi 驱动程序将事件 WIFI_EVENT_STA_START 发布到事件任务中,然后,事件任务将执行一些正常 *** 作并调用应用程序的事件回调函数
ESP_LOGI(TAG, "wifi_init_sta finished.")
/* Waiting until either the connection is established (WIFI_CONNECTED_BIT) or connection failed for the maximum
* number of re-tries (WIFI_FAIL_BIT). The bits are set by event_handler() (see above) */
EventBits_t bits = xEventGroupWaitBits(s_wifi_event_group,
WIFI_CONNECTED_BIT | WIFI_FAIL_BIT,
pdFALSE,
pdFALSE,
portMAX_DELAY)
/* xEventGroupWaitBits() returns the bits before the call returned, hence we can test which event actually
* happened. */
if (bits &WIFI_CONNECTED_BIT) {
ESP_LOGI(TAG, "connected to ap SSID:%s password:%s",
EXAMPLE_ESP_WIFI_SSID, EXAMPLE_ESP_WIFI_PASS)
} else if (bits &WIFI_FAIL_BIT) {
ESP_LOGI(TAG, "Failed to connect to SSID:%s, password:%s",
EXAMPLE_ESP_WIFI_SSID, EXAMPLE_ESP_WIFI_PASS)
} else {
ESP_LOGE(TAG, "UNEXPECTED EVENT")
}
printf("sequence7.\n")
/* The event will not be processed after unregister */
ESP_ERROR_CHECK(esp_event_handler_instance_unregister(IP_EVENT, IP_EVENT_STA_GOT_IP, instance_got_ip))
ESP_ERROR_CHECK(esp_event_handler_instance_unregister(WIFI_EVENT, ESP_EVENT_ANY_ID, instance_any_id))
vEventGroupDelete(s_wifi_event_group)
printf("sequence8.\n")
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
3、回调函数
在esp_wifi_start()即WiFi启动后调用esp_event_handler_instance_register()向WiFi组件注册事件通知,调用回调函数event_handler(),WiFi驱动程序将WIFI_EVENT_STA_START发布到事件任务;然后,事件任务将执行一些常规 *** 作,并将调用应用程序事件回调函数。应用程序事件回调函数将WIFI_EVENT_STA_START中继到应用程序任务。
在idf中,整个WiFi协议栈是一个状态机,在每个时刻都有一个状态,当WiFi状态机的状态变化时就会调用event_handler()并给它传递适当的参数。
static void event_handler(void* arg, esp_event_base_t event_base,
int32_t event_id, void* event_data)
{
if (event_base == WIFI_EVENT &&event_id == WIFI_EVENT_STA_START) {
esp_wifi_connect()//4. Wi-Fi 连接阶段
printf("wifi event start.\n")
}
else if (event_base == WIFI_EVENT &&event_id == WIFI_EVENT_STA_DISCONNECTED) {//6. Wi-Fi 断开阶段
if (s_retry_num <EXAMPLE_ESP_MAXIMUM_RETRY) {
esp_wifi_connect()
s_retry_num++
ESP_LOGI(TAG, "retry to connect to the AP")
} else {
xEventGroupSetBits(s_wifi_event_group, WIFI_FAIL_BIT)
}
ESP_LOGI(TAG,"connect to the AP fail")
}
else if (event_base == IP_EVENT &&event_id == IP_EVENT_STA_GOT_IP) {//5. Wi-Fi 获取 IP 阶段
ip_event_got_ip_t* event = (ip_event_got_ip_t*) event_data
ESP_LOGI(TAG, "got ip:" IPSTR, IP2STR(&event->ip_info.ip))
s_retry_num = 0
xEventGroupSetBits(s_wifi_event_group, WIFI_CONNECTED_BIT)
}
else
{
printf("sequence6.\n")
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
可以看出回调函数有三个阶段:WiFi连接阶段;断开阶段;获取IP阶段
三、终端查看连接过程状态
将WiFi demo烧录进esp32开发板,通过log可以看到在启动WiFi后即esp_wifi_start()后进入回调函数WIFI_EVENT_STA_START中connect配置中的WiFi
当连接失败再次进入回调WIFI_EVENT_STA_DISCONNECTED中重连5次
然后 WIFI_CONNECTED_BIT 或 WIFI_FAIL_BIT 被置位后,打印出信息并删除一些变量,打印出ssid与password
最后注销事件通知
在log中看到ssid与password,进入sdkconfig文件夹中看到默认的SSID与PASSWORD,以及重连的次数为5次
现在在idf.py menuconfig中更改下ssid与password以连接到路由器。在example configuration中修改可以连接上的路由器名称与密码
修改完WiFi信息后再编译烧录进开发板看到输出信息如下,重连两次get IP成功连上路由器,连接成功后我关闭了路由器也就是断网在打开路由器并没有重连WiFi,这是因为在sta函数最后将该事件注销掉了也就不会处理该事件
将注销事件这三行程序注释掉再尝试断网,打开网络之后能重连上,注意在此demo中只会重连5次,5次之后便连接不上了。
在实际项目中应该断连之后应该一直尝试连接。可注释掉这几行当掉线时一直去连接
利用局域网网络转串口模块可以方便进行自动控制系统的搭建以及相应的调试。比如手头现在存在的已经停产的 USR-WiFi-232-T [1] 模块,可以比较方便通过手机进行设置,完成UDP-232的转换。
这款模块现在也被应用在无线调试情境中:
图1.1 USR-WiFi 模块
MicroPython在很多平台上都有着应用,包括 STM32F40x,ESP32,ESP8266,PicoPy等。利用 Thonny软件 [4] 比较方便利用串口完成对于MicroPython的开发与调试。可否使用WiFi转串口来完成对于MicroPython模块的调试呢?
这其中需要使用到 UDP-COM的虚拟软件,这样便可以利用WiFi模块完成对于普通的MicroPython模块的开发。
相关的前期工作包括:
VSPM是一款可以被将TCP/IP, UDP转换成串口的虚拟串口软件。VSPM 虚拟串口软件可以将TCP/IP 连接映射成本机的虚拟COM 口,应用程序通过访问虚拟串口,就可以完成远程控制、数据传输等功能。对于调试串口相关的程序非常方便。下面将详细介绍该软件的使用方法。
在 虚拟串口软件VSPM使用手册 [10] 给出了VSPM应用的一般说明。
您下载的该文件来自于华军软件园(www.onlinedown.net)
what you are downloading are from Onlinedown Download Site:(www.onlinedown.net)
VSPM虚拟串口 2.82 [12]
使用VSPM设置虚拟串口的过程中,始终存在着“ 无法创建串口 ”的错误。提示为选取的串口可能已经被占用。
图1.0 无法建立虚拟串口
根据 释放windows中被占用的串口号-方法总结 [13] 给出的方法,将Windows被占用的串口资源进行释放,提供给VSPM使用。
利用快捷键: win + R 启动运行界面,输入 regedit :
图1.1 运行 regedit
图1.2 删除ComDB选项
移除设备的硬件映射,HKEY_LOCAL_MACHINE/HARDWARE/DEVICEMAP/SERIALCOMM,选中这几个串口,右键做唯裂删除
图1.3 删除山腊CurrentVersion/Ports
移除设备的硬件映射,HKEY_LOCAL_MACHINE/HARDWARE/DEVICEMAP/SERIALCOMM,选中这几个串口,右键删除
图1.4 删除不使用的SERIALPORT
通过测试之后发现,使用VSPM始终无法完成在Window7下的虚拟串口创建。
由于所使用的模块是 有人物联网 [14] 的产品,那么使用 USR-VCOM [15] 软件应该非常方便。
图1.2.0.0 USR下载软件
运行安装USR-VCOM软件,之后,通过添加,设置虚拟串口。
图1.2.0 添加虚拟串口
图1.2.1 添加虚拟串口
在计算机设备管理中可以看到COM7,这表明虚拟串口已经添加成功了纯闭。
图1.2.2 在计算机设备管理中可以看到COM7
图2.1 发送与接收测试
从 制作新版STC单片机WiFi下载器 [3] 获得设计STC单片机WiFi下载器 [17] 获得设计STC单片机WiFi下载器[^43037]中所使用的 USR接口定义。
从 ESP32-S模块转接板设计与实现 [7] 获得对于ESP32等具有MicroPython [18] 获得对于ESP32等具有MicroPython[^43006]调试界面模块的下载管脚定义。
图2.1 转接板原理图
(2) PCB
图2.2 转接板PCB图
3、快速制版
图2.3 快速制版的实验板
接入 3.3V 电源。 工作电流大约 56mA 。该 USR-WiFi 模块根据之前的设置自动接入的实验室内的 WiFi 的无线网关。
图2.4 模块上电后接入626A的WiFi
通过PING命令可以测量USR-WiFi 已经在局域无线网络中。
图2.5 PIng WiFI模块
使用USR-VCOM设置对应的串口。
图2.2.1 设置串口
使用STM32BOOTLOADER打开COM7,发送字符。通过波形可以看到波特率为 460800.
图2.2.2 测量得到RXD输出的波形
使用手机接入USR-WiFi,并通过浏览器对WiFi模块的串口进行设置。
使用手机浏览器接入10.10.100.254,设置其中的串口。
图2.2.3.1 使用手机浏览器打开网页
(2) 串口参数设置
图2.2.3.2 串口参数设置
三、测试ESP32 1、将转接模块接入ESP32
图2.3.1.1 接入ESP32调试模块
打开 Thonny [5] 开发环境,设置 Interpreter接口参数。
图2.3.2.1 设置Thonny串口
设置之后,便可以在Thonny的Shell中完成初步的语句测试了。
可以在Thonny中下载程序进行执行。
图2.3.3.1 下载程序执行
经过测试,在WiFi下,对于ESP32进行复位,相对反应比较慢。可能这是由于无法进行硬件复位的原因。
通过测试,可以使用有人 USR-VCOM建立起UDP到虚拟串口的映射关系。基于此,使用了USR-WiFi模块设置了基于UDP的无线WiFI串口。并在Thonny开发环境中测试了这个串口用于调试ESP32 MicroPython程序的功能。
由于并没有将串口的硬件复位引入转换模块,所以在调试的过程中重新下载程序过程比起直接使用串口变得缓慢了。这一点需要通过之后改进来完成。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)