开发板

K210开发板

基于K210开发板局域网通讯测试_数据

实验目的

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

实验元件

板载WiFi 模块

基于K210开发板局域网通讯测试_#define_02

元件特性

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,拔掉跳线帽则不通。

基于K210开发板局域网通讯测试_服务器_03

实验准备

WiFi 模块联网的基础上增加设置 WiFi 模块为客户端的功能。这样的好处是开机能够自动连接服务器,并且可以设置为透传模式。

实验原理

ESP8285 WiFi 模块是作为客户端接收电脑 TCP 服务器的信息,根据自定义的协议解析,并且根据数据内容实现不同的功能。相当于局域网内远程控制 K210开发板。

实验过程

  1. 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)
  1. 初始化串口的配置,波特率设置为 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);
  1. 开机的时候发送“hello yahboom!”,提示已经开机完成。
char *hello = {"hello yahboom!\n"};
    uart_send_data(UART_USB_NUM, hello, strlen(hello));
  1. 自定义变量,主要用于记录和保存数据。
/* 接收和发送缓存的数据 */
    char recv = 0, send = 0;
    /* 接收WiFi模块数据标志 */
    int rec_flag = 0;
    /* 保存接收的数据 */
    char recv_data[MAX_DATA] = {0}; 
    /* recv_data下标 */
    uint16_t index = 0;
  1. 在接收到数据的时候进行判断,默认 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;
  1. 开始接收数据,首先是判断是否是‘#’结束符,如果是就结束,并且调用 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;
            }
  1. 解析数据,对比数据是否与设定的一致,如果一致则执行对应的内容。
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);
    }
}
  1. 把接收的串口数据传输给 WiFi 模块。
/* 接收串口的信息,并发送给WiFi模块 */
        if(uart_receive_data(UART_USB_NUM, &send, 1))
        {
            uart_send_data(UART_WIFI_NUM, &send, 1);
        }
  1. 编译调试,烧录运行 进入自己项目 build目录,运行以下命令编译。
cmake .. -DPROJ=watchdog -G "MinGW Makefiles"
make

实验现象

  • 烧录完成固件后,系统会弹出一个终端界面,如果没有弹出终端界面的可以打开串口助手显示调试内容。

基于K210开发板局域网通讯测试_数据_04

  • 从串口助手,可以接收到 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 的基础上增加了数据的判断和解析的功能。