我是靠谱客的博主 魁梧硬币,最近开发中收集的这篇文章主要介绍Rtthread学习笔记(二十)RT-Thread使用Esp8266,连接远端服务器IP端口发送数据Rtthread学习笔记(二十)RT-Thread使用Esp8266,连接远端服务器IP端口发送数据,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

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

  • stm32 
  • RT-Thread 

一、步骤

将RTThread移植到STM32上,添加esp8266,连接wifi,从而实现stm32与服务器通讯。其中STM32做客户端,在华为云服务器上开的网络调试助手(具有固定IP端口)做服务器,esp8266的作用是将串口数据透传到网络上,是客户端的一部分。
STM32与esp8266通讯采用串口通讯,应用层协议使用AT指令集,STM32做AT客户端(AT Client),esp8266做AT 服务器(AT Server),注意区别上面的网络层的客户端与服务器。使用esp8266,连接wifi,获取自身本地IP,进入透传模式,向远端服务器发送数据。

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


这个esp8266在Rtthread上使用真是花了好几天时间调通(用的是野火指南者开发板自带了ESP8266,也可以整一个模块直接连在对应的引脚上)。先发送数据成功,大体上用着,以后有项目再仔细研究。程序在末尾贴出。
参照资料RTThread-ESP8266章节
RTThread-AT章节

使用串口3:

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

1、配置时钟

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

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

2、开启Uart3

在board.h中开启串口3的宏定义,并设置上引脚

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

3、添加AT软件包

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


进行详细配置,保存

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

4、编译

保存编译后会出现一个错误,这是缺少libc的接口函数,开启RT-Thread Setting 中的libc

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

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

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

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

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

6.使能esp8266、开启重启esp8266

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

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

7.修改打印信息问题

使能重启后编译下载,会看到串口打印信息,显示接收到字符串超出接收范围(也可能是这块板载的模块会这样),如果自行连接的esp8266没出现就不需要调整这块内容。出现接收字符串超出范围是因为模块重启会发出一长串字符导致的,解决方式有两种,第一种去掉系统初始化的重启语句(在esp8266初始化的线程中esp8266_init_thread_entry),第二种加大接收回应的字符串大小。我的是直接注释掉重启,加长延时到2000ms。

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


第一种方法:去掉系统初始化的重启语句(在esp8266初始化的线程中esp8266_init_thread_entry),稍微加长点延时,因为我们在程序初始化的时候已经重启过,这里去掉重启语句也没关旭,但是需要适当加长延时给模块充裕的重启时间。

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

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


第二种方法:加大接收数据的缓冲组大小

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

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


 

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

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

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

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

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


重新初始化无非就是对esp8266重新进行一遍AT指令的设置。
 

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

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

9.通讯测试结果

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

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


设备:

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


服务器:

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

二、代码

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 
#include 
#include 
#include 
#include 
#include 
#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=1rn");
}
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_Esp8266rn");
}
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_ */

最后

以上就是魁梧硬币为你收集整理的Rtthread学习笔记(二十)RT-Thread使用Esp8266,连接远端服务器IP端口发送数据Rtthread学习笔记(二十)RT-Thread使用Esp8266,连接远端服务器IP端口发送数据的全部内容,希望文章能够帮你解决Rtthread学习笔记(二十)RT-Thread使用Esp8266,连接远端服务器IP端口发送数据Rtthread学习笔记(二十)RT-Thread使用Esp8266,连接远端服务器IP端口发送数据所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(34)

评论列表共有 0 条评论

立即
投稿
返回
顶部