esp32作为一个热门芯片,网上的文章很多,sdk里的例子和官网的教程也是比较详细。不过作为新玩家,还是要先做一些小改动才更容易入门。所以这里就综合几个example代码,写一个简单的透传demo。
操作系统:ubuntu 20.04
虚拟机:VMare Workstation 16
IDE:vscode 1.73.1
vscode插件:Espressif IDF v1.5.1
board:淘宝上的ESP32-S3-DevKitC-1兼容板
外置串口板子:淘宝上的cp2102 6合1串口模块
通过外部的串口模块,连接ESP32-S3-DevKitC-1开发板上的IO4和5,与电脑进行通讯。
而串口指令,参考一下某透传模块的文档,提取并简化成了以下几条:
指令 | ATWS |
---|---|
响应 | AP : [ATWS] OK |
指令 | ATPN= |
---|---|
响应 | 成功 [ATPN] OK 失败 [ATPN] ERROR: |
error_code | 1: 命令格式错误 2: 参数错误 3: 连接 AP错误 4: dhcp 超时 |
指令 | ATPC= |
---|---|
响应 | 成功 [ATPC] OK 失败 [ATPC]: |
参数 | mode: 0:TCP |
error_code | 1: 命令格式错误 2: 参数错误 3: 连接 server错误 4: 尚未连接AP |
指令 | ATPU |
---|---|
响应 | 成功 [ATPU] OK 失败 [ATPU] ERROR: |
error_code | 1: 命令格式错误 2: 尚未连server |
https://editor.csdn.net/md/?articleId=128134802
通过<新建esp32的vscode工程的三种方式>中的<通过"ESP-IDF:New Project"创建新工程>这个方法,创建一个以esp-idf/examples/wifi/scan为模板的工程esp32_network123,这也是本文中的主工程模板
接着再通过<通过vscode的"ESP-IDF:Show Examples Project"页面中新建工程>这个方法,通过SDK中的以下几个例子:
esp-idf/examples/wifi/scan
esp-idf/examples/wifi/getting_started/station
esp-idf/examples/protocols/sockets/udp_client
esp-idf/examples/peripherals/uart/uart_echo
为模板分别创建几个参考的工程。
在vscode下打开工程esp32_network123工程,并在main文件夹上右键,选中"New File",新建两个文件:app_main.c和wifi.c。并将原本自带的scan.c文件删除。
注:这种通过vscode来新建和删除文件的行为,会通过插件,自动的修改对应的CMakeLists.txt文件。省却了一些麻烦的操作。
其中在app_main.c内添加代码:
#define WIFI_TASK_STACK_SIZE (1024*16)
extern void wifi_task(void *arg);
void app_main(void)
{xTaskCreate(wifi_task, "wifi_task", WIFI_TASK_STACK_SIZE, NULL, 10, NULL);
}
用于新建wifi任务。
而wifi.c则参考原有的scan.c,在wifi.c内实现的wifi_task()任务用来初始化WIFI,并配置成sta模式
void wifi_task(void *arg)
{
...// Initialize Wi-Fi as staESP_ERROR_CHECK(esp_netif_init());ESP_ERROR_CHECK(esp_event_loop_create_default());esp_netif_t *sta_netif = esp_netif_create_default_wifi_sta();assert(sta_netif);wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();ESP_ERROR_CHECK(esp_wifi_init(&cfg));ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_STA));ESP_ERROR_CHECK(esp_wifi_start());wifi_scan();while(1) {vTaskDelay( 5000/portTICK_PERIOD_MS );ESP_LOGI(TAG, "delay");}
}
上面的代码中调用的wifi_scan()调用后直接触发扫描,并将结果打印出来:
static void wifi_scan(void)
{uint16_t number = DEFAULT_SCAN_LIST_SIZE;memset(ap_info, 0, sizeof(ap_info));esp_wifi_scan_start(NULL, true);ESP_ERROR_CHECK(esp_wifi_scan_get_ap_records(&number, ap_info));ESP_ERROR_CHECK(esp_wifi_scan_get_ap_num(&ap_count));ESP_LOGI(TAG, "Total APs scanned = %u", ap_count);for (int i = 0; (i < DEFAULT_SCAN_LIST_SIZE) && (i < ap_count); i++) {wifi_print_scan(ap_info,i);//按照需求的格式打印AP列表}
}
https://github.com/chenbb8/esp32_network123
代码clone下来后,还需要用到<新建esp32的vscode工程的三种方式>中的<将普通esp-idf工程升级成esp-vscode工程>这个方法,修改一下本地的程序。