Rtthread学习笔记(二十)RT-Thread使用Esp8266,连接远端服务器IP端口发送数据

stm32 同时被 2 个专栏收录
39 篇文章 0 订阅
23 篇文章 15 订阅

一、步骤

将RTThread移植到STM32上,添加esp8266,连接wifi,从而实现stm32与服务器通讯。其中STM32做客户端,在华为云服务器上开的网络调试助手(具有固定IP端口)做服务器,esp8266的作用是将串口数据透传到网络上,是客户端的一部分。
STM32与esp8266通讯采用串口通讯,应用层协议使用AT指令集,STM32做AT客户端(AT Client),esp8266做AT 服务器(AT Server),注意区别上面的网络层的客户端与服务器。使用esp8266,连接wifi,获取自身本地IP,进入透传模式,向远端服务器发送数据。
在这里插入图片描述
这个esp8266在Rtthread上使用真是花了好几天时间调通(用的是野火指南者开发板自带了ESP8266,也可以整一个模块直接连在对应的引脚上)。先发送数据成功,大体上用着,以后有项目再仔细研究。程序在末尾贴出。
参照资料RTThread-ESP8266章节
RTThread-AT章节

使用串口3:
在这里插入图片描述

1、配置时钟

依旧使用RT-Thread Studio创建一个新工程,上来第一件事先配置外部时钟,替换board.c中的void SystemClock_Config(void)
在这里插入图片描述

2、开启Uart3

在board.h中开启串口3的宏定义,并设置上引脚
在这里插入图片描述

3、添加AT软件包

在这里插入图片描述
进行详细配置,保存
在这里插入图片描述

4、编译

保存编译后会出现一个错误,这是缺少libc的接口函数,开启RT-Thread Setting 中的libc
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

5.添加两个文件app_esp8266.c app_esp8266.h

在这里插入图片描述

6.使能esp8266、开启重启esp8266

指南者开发板的使能引脚是PB8,上电初始化前需要先进行高电平使能;rst重启引脚是PB9,低电平复位,开机复位的原因是,因为在调试过程中我只是调试程序未断电模块,回有模块初始化失败的情况出现,因此在程序中主动控制一下复位引脚。这俩引脚都是可以根据实际需求更换的。
在这里插入图片描述

7.修改打印信息问题

使能重启后编译下载,会看到串口打印信息,显示接收到字符串超出接收范围(也可能是这块板载的模块会这样),如果自行连接的esp8266没出现就不需要调整这块内容。出现接收字符串超出范围是因为模块重启会发出一长串字符导致的,解决方式有两种,第一种去掉系统初始化的重启语句(在esp8266初始化的线程中esp8266_init_thread_entry),第二种加大接收回应的字符串大小。我的是直接注释掉重启,加长延时到2000ms。
在这里插入图片描述
第一种方法:去掉系统初始化的重启语句(在esp8266初始化的线程中esp8266_init_thread_entry),稍微加长点延时,因为我们在程序初始化的时候已经重启过,这里去掉重启语句也没关旭,但是需要适当加长延时给模块充裕的重启时间。
在这里插入图片描述
在这里插入图片描述
第二种方法:加大接收数据的缓冲组大小

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

8.重新在应用函数中编写初始化函数

在这里插入图片描述
重新初始化无非就是对esp8266重新进行一遍AT指令的设置。
在这里插入图片描述
在这里插入图片描述

9.通讯测试结果

我这里是手里正好有个华为云服务器,我直接在云服务器上开启了一个网络调试助手,将服务器的10086端口映射到了内部192.168.0.7的10086端口上(云服务器安全组-入方向规则),在内部主机开启了10086的端口,外部设备就可以通过连接服务器的固定IP的10086端口,来向内部主机发送数据了。如果不是云服务器,恰巧有条件控制到的路由器使用的是固定IP,也可以配置例如华3路由器–网络连接高级设置-虚拟网络映射,从而映射到你本地的端口上。不想这么费事,直接连接设置个局域网内的本体端口,连接上一样测试数据。
在这里插入图片描述
设备:
在这里插入图片描述
服务器:
在这里插入图片描述

二、代码

app_esp8266.c

/*
 * Copyright (c) 2006-2020, RT-Thread Development Team
 *
 * SPDX-License-Identifier: Apache-2.0
 *
 * Change Logs:
 * Date           Author       Notes
 * 2020-05-08            the first version
 */
#include <rtthread.h>
#include <board.h>
#include <rtdevice.h>
#include <rtconfig.h>
#include <rtdbg.h>
#include <at_device_esp8266.h>
#include "app_esp8266.h"

/*使能esp8266 */
void Set_Esp8266_En(void)
{
    rt_pin_mode(GET_PIN(B, 8), PIN_MODE_OUTPUT);
    rt_pin_write(GET_PIN(B, 8), 1);
    rt_kprintf("esp8266_Enable,PB8=1\r\n");
}
INIT_PREV_EXPORT(Set_Esp8266_En);
/*重启esp8266 */
void Reset_Esp8266(void)
{
    rt_pin_mode(GET_PIN(B, 9), PIN_MODE_OUTPUT);
    rt_pin_write(GET_PIN(B, 9), 0);
    rt_thread_mdelay(200);
    rt_pin_write(GET_PIN(B, 9), 1);
    rt_kprintf("Reset_Esp8266\r\n");
}
INIT_PREV_EXPORT(Reset_Esp8266);

/*esp8266结构体回调函数 */
void CallBack(char *Cmd,float Cycle)
{
}

/*初始化esp8266命令结构体,回调函数暂时没用到 */
typEsp8266_t typEsp8266CmdTable[]=
{
    {"AT+CWMODE=1",                                 CallBack},          //1:工作在客户端模式
    {"AT+CWJAP=\"QIANTAI\",\"12345678#\"",          CallBack},          //2: 连接无线
    {"AT+CIFSR",                                    CallBack},          //3: 获取自身的IP及Mac地址
    {"AT+CIPMUX=0",                                 CallBack},          //4:关闭多连接
    {"AT+CIPSTART=\"TCP\",\"121.36.63.46\",10086",  CallBack},          //5:连接服务器IP端口
    {"AT+CIPMODE=1",                                CallBack},          //6:透传模式
    {"AT+CIPSEND",                                  CallBack}           //7:启动透传,之后esp8266进入透传状态,发送的数据将转发向服务器,不再识别AT指令
};

/*重新配置esp8266 */
int esp8266_init_Reconfiguring(void)
{
    at_response_t resp = RT_NULL;
    const char *line_buffer = RT_NULL;

    /* 创建响应结构体,设置最大支持响应数据长度为 512 字节,响应数据行数无限制,超时时间为8 秒 */
    resp = at_create_resp(512, 0, rt_tick_from_millisecond(8000));
    if (!resp)
    {
        LOG_E("No memory for response structure!");
        return -RT_ENOMEM;
    }
    /* 发送 AT 命令并接收 AT Server 响应数据,数据及信息存放在 resp 结构体中并打印出来 */
    for(int i=0;i<array_sizeof(typEsp8266CmdTable);i++)
    {
        if (at_exec_cmd(resp, typEsp8266CmdTable[i].CmdString) != RT_EOK)               //发送AT指令
        {
            LOG_E("%s指令没收到esp8266的回应",typEsp8266CmdTable[i].CmdString);
        }
        else
        {
            for(rt_size_t line_num = 1; line_num <= resp->line_counts; line_num++)      //将回应的数据打印出来
                {
                    if((line_buffer = at_resp_get_line(resp, line_num)) != RT_NULL)
                    {
                        LOG_D("%s line%d Response buf: %s",typEsp8266CmdTable[i].CmdString,line_num, line_buffer);
                    }
                    else
                    {
                        LOG_E("Parse line buffer error!");
                    }
                }
        }
    }
    rt_thread_mdelay(20);
    at_exec_cmd( resp, "由开发板发来的第一次测试数据1");
    at_exec_cmd( resp, "由开发板发来的第二次测试数据2");

    /* 命令发送成功 */
    LOG_D("AT Client send commands to AT Server success!");

    /* 删除响应结构体 */
    at_delete_resp(resp);

    return RT_EOK;
}

app_esp8266.h

/*
 * Copyright (c) 2006-2020, RT-Thread Development Team
 *
 * SPDX-License-Identifier: Apache-2.0
 *
 * Change Logs:
 * Date           Author       Notes
 * 2020-05-08            the first version
 */
#ifndef APPLICATIONS_APP_ESP8266_H_
#define APPLICATIONS_APP_ESP8266_H_

#define array_sizeof(a) (sizeof(a) / sizeof(a[0]))
/* 服务函数结构体*/
typedef struct typ_Esp8266_handler
{
  char  *CmdString; //命令字符串
  void  (*CmdOperate)(char *Cmd,float Cycle);//命令执行的功能操作
} typEsp8266_t;

extern int esp8266_init_Reconfiguring(void);

#endif /* APPLICATIONS_APP_ESP8266_H_ */

  • 6
    点赞
  • 3
    评论
  • 30
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值