开发板
K210开发板

实验目的
本次测试主要学习 WiFi 模块的设置为客户端,电脑作为服务器在局域网的范 围内远程控制点灯。
实验元件
板载WiFi 模块

元件特性
K210 开发板自带的 WiFi 模块是 ESP8285 芯片模块,其实 ESP8285 还有更加热门的好兄弟 ESP8266,ESP8285 与 ESP8266 共享同一套 SDK,ESP8285 比 ESP8266多了一片 1MB FLASH 芯片,并且是 DOUT 模式,所以固件编译和下载时需要设置为 DOUT 模式才可以下载;而且还多了两个 IO 口(GPIO9 和 GPIO10)可以供用户使用。 除此之外,ESP8285 还有其他特性,如:体积小、远距离传输、低功耗、可外接天线、耐高温、无线透传、串口转 WiFi 等。
硬件连接
K210 开发板出厂默认已经焊接好 WiFi 模块,WiFi 模块与 K210 之间有三个跳线帽,如果插入跳线帽,则 ESP8285 的 WIFI_TXD 连接 K210 的 IO13,WIFI_RXD连接 IO14,WIFI_EN 连接 IO15,拔掉跳线帽则不通。

实验准备
WiFi 模块联网的基础上增加设置 WiFi 模块为客户端的功能。这样的好处是开机能够自动连接服务器,并且可以设置为透传模式。
实验原理
ESP8285 WiFi 模块是作为客户端接收电脑 TCP 服务器的信息,根据自定义的协议解析,并且根据数据内容实现不同的功能。相当于局域网内远程控制 K210开发板。
实验过程
- IO4 和 IO5 是 K210 开发板的 USB 串口引脚,使用的是串口 3,而 WiFi 模块的引脚是 IO13 和 IO14,使用的是串口 1。
// 硬件IO口,与原理图对应
#define PIN_UART_USB_RX (4)
#define PIN_UART_USB_TX (5)
#define PIN_UART_WIFI_RX (13)
#define PIN_UART_WIFI_TX (14)
#define PIN_LED_0 (0)
#define PIN_LED_1 (17)
/*****************************SOFTWARE-GPIO********************************/
// 软件GPIO口,与程序对应
#define UART_USB_NUM UART_DEVICE_3
#define UART_WIFI_NUM UART_DEVICE_1
#define LED0_GPIONUM (10)
#define LED1_GPIONUM (11)
/*****************************FUNC-GPIO************************************/
// GPIO口的功能,绑定到硬件IO口
#define FUNC_UART_USB_RX (FUNC_UART1_RX + UART_USB_NUM * 2)
#define FUNC_UART_USB_TX (FUNC_UART1_TX + UART_USB_NUM * 2)
#define FUNC_UART_WIFI_RX (FUNC_UART1_RX + UART_WIFI_NUM * 2)
#define FUNC_UART_WIFI_TX (FUNC_UART1_TX + UART_WIFI_NUM * 2)
#define FUNC_LED0 (FUNC_GPIOHS0 + LED0_GPIONUM)
#define FUNC_LED1 (FUNC_GPIOHS0 + LED1_GPIONUM)- 初始化串口的配置,波特率设置为 115200,串口数据宽度为 8 位,停止位1 位,不使用奇偶校验。
// 初始化USB串口,设置波特率为115200
uart_init(UART_USB_NUM);
uart_configure(UART_USB_NUM, 115200, UART_BITWIDTH_8BIT, UART_STOP_1, UART_PARITY_NONE);
/* 初始化WiFi模块的串口 */
uart_init(UART_WIFI_NUM);
uart_configure(UART_WIFI_NUM, 115200, UART_BITWIDTH_8BIT, UART_STOP_1, UART_PARITY_NONE);- 开机的时候发送“hello yahboom!”,提示已经开机完成。
char *hello = {"hello yahboom!\n"};
uart_send_data(UART_USB_NUM, hello, strlen(hello));- 自定义变量,主要用于记录和保存数据。
/* 接收和发送缓存的数据 */
char recv = 0, send = 0;
/* 接收WiFi模块数据标志 */
int rec_flag = 0;
/* 保存接收的数据 */
char recv_data[MAX_DATA] = {0};
/* recv_data下标 */
uint16_t index = 0;- 在接收到数据的时候进行判断,默认 rec_flag 为 0,如果接收到‘$’则表示开始接收数据,rec_flag=1,其中 MAX_DATA 可以自己设定大小,比协议数据内容的最大值大就可以了,这里设置为 10,表示最多能容纳 10 字符。
/* 接收WIFI模块的信息 */
if(uart_receive_data(UART_WIFI_NUM, &recv, 1))
{
/* 发送接收到的数据到USB串口显示 */
uart_send_data(UART_USB_NUM, &recv, 1);
/* 判断是否符合数据要求 */
switch(rec_flag)
{
case 0:
/* 以‘$’符号为数据开始 */
if(recv == '$')
{
rec_flag = 1;
index = 0;
for (int i = 0; i < MAX_DATA; i++)
recv_data[i] = 0;
}
break;- 开始接收数据,首先是判断是否是‘#’结束符,如果是就结束,并且调用 parse_data 解析数据;如果超过了最大数据还没有接收到‘#’结束符,则表示异常,让 rec_flag 为 0;最后才是保存数据到 recv_data 中。
case 1:
if (recv == '#')
{
/* 以‘#’符号为数据结束 */
rec_flag = 0;
parse_data(recv_data);
}
else if (index >= MAX_DATA)
{
/* 超过最大数据没有接收到结束符‘#’,则清除 */
rec_flag = 0;
index = 0;
}
else
{
/* 保存数据到recv_data中 */
recv_data[index++] = recv;
}
break;
default:
break;
}- 解析数据,对比数据是否与设定的一致,如果一致则执行对应的内容。
void parse_data(char *data)
{
// uart_send_data_dma(UART_USB_NUM, DMAC_CHANNEL0, data, sizeof(data));
/* 解析并对比发送过来的数据 */
if (0 == memcmp(data, "led0_0", 6))
{
led0_state(LED_OFF);
}
else if (0 == memcmp(data, "led0_1", 6))
{
led0_state(LED_ON);
}
else if (0 == memcmp(data, "led1_0", 6))
{
led1_state(LED_OFF);
}
else if (0 == memcmp(data, "led1_1", 6))
{
led1_state(LED_ON);
}
}- 把接收的串口数据传输给 WiFi 模块。
/* 接收串口的信息,并发送给WiFi模块 */
if(uart_receive_data(UART_USB_NUM, &send, 1))
{
uart_send_data(UART_WIFI_NUM, &send, 1);
}- 编译调试,烧录运行 进入自己项目 build目录,运行以下命令编译。
cmake .. -DPROJ=watchdog -G "MinGW Makefiles"
make实验现象
- 烧录完成固件后,系统会弹出一个终端界面,如果没有弹出终端界面的可以打开串口助手显示调试内容。

- 从串口助手,可以接收到 hello yahboom!的欢迎语。然后按一下 WiFi 模块的复位键,可以看到一大串乱码,这个不用管,只要看到 ready 字符则表示 WiFi模块正常。由于上一节课已经连接好路由器,所以我们这次就不必重复连接。
- 先打开网络调试助手 NetAssist,利用网络调试助手来搭建一个 TCP服务器。设置网络调试助手的参数,在左上角网络设置中,(1)协议类型选择 TCP Server;(2)远程主机地址选择本地(电脑)的 IP 地址,如果不清楚的可以查看下一步说明;(3)远程主机端口输入 8086。最后点击打开。这里必须要注意一点就是使用的电脑必须要与WiFi连接的是同个路由器,否则是无法连通的。
- 如何知道自己电脑的 IP 地址?以 win10x64 位系统为例,按 Win+R,在弹出的对话框输入 cmd 并按回车打开终端,输入ipconfig 命令。
- 服务器打开完成之后,没有客户端连接的情况下会显示客户端为 0,每连接一个数值自动加 1。
- 接下来 WiFi 模块设置为客户端去连接服务器,只需要以下命令。AT+SAVETRANSLINK=1,"服务器 IP",远程端口,"TCP"这里以连接电脑服务器 IP 地址为‘192.168.3.103’,远程端口为 8086 为例。 接收到 OK,就表示数据已经写入进去了,但是此时还不会连接到服务器,需要重启一下 WiFi 模块。输入 AT+RST 命令重启 WiFi 模块,接收到 ready,没有接收到 WiFi 连接的信息,此时表示已经成功。因为此命令会保存到 flash,开机会自启动,并且进入透传模式,如果需要退出透传模式,请先取消‘AT 指令自动回车’的勾,然后发‘+++’就可以
- 此时服务器会显示一个已经连接的设备。
- 此时从服务器发送数据给客户端,客户端也可以显示接收到的数据,或者从客户端发送数据给服务器,服务器也可以接收到数据。这就是透传模式的工作方式。我们送服务器发送点亮LED0 的协议‘$led0_1#’,可以看到 LED0 红灯亮起。
实验总结
- 本次以 WiFi 模块作为客户端的工作方式为例,至于 WiFi 模块作为服务器的方 式与 K210的程序是一致的,所以就不再演示服务器的方式。
- wifi_module 程序只是在 wifi_AT 的基础上增加了数据的判断和解析的功能。
6808

被折叠的 条评论
为什么被折叠?



