一、步骤

将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_ */

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

  1. Mr.J-- jQuery学习笔记(二十八)--DOM操作方法(添加方法总结)

    Table of Contents appendTo appendTo(source, target) 源代码 append prependTo ​ ​ ​ ​ prependTo源码 prepend ...

  2. 嵌入式系统设计师学习笔记二十八:嵌入式程序设计③——高级程序设计语言

    嵌入式系统设计师学习笔记二十八:嵌入式程序设计③--高级程序设计语言 解释程序和编译程序 编译器的工作阶段示意图 语法错误:非法字符,关键字或标识符拼写错误 语法错误:语法结构出错,if--endif ...

  3. uniapp 学习笔记二十二 购物车页面结构搭建

    uniapp 学习笔记二十二 购物车页面结构搭建 cart.vue <template><view><view class="flex padding" ...

  4. Polyworks脚本开发学习笔记(二十)-补充几个常见操作指令的使用

    Polyworks脚本开发学习笔记(二十)-补充几个常见操作指令的使用 大概要写到结尾了,最后几篇就将手册的各常用命令再看一遍,组合一下,并列举出常见的一些有用的操作. DATA_COLOR_MAP数 ...

  5. JVM 学习笔记二十六、JVM监控及诊断工具-GUI篇

    二十六.JVM监控及诊断工具-GUI篇 1.工具概述 使用上一张命令行工具或组合能帮您获取目标Java应用性能相关的基础信息,但他们存在下列局限: (1)无法获取方法级别的分析数据,如方法间的调用关系 ...

  6. JVM 学习笔记二十五、JVM监控及诊断工具-命令行篇

    二十五.JVM监控及诊断工具-命令行篇 1.概述 性能诊断是软件工程师在日常工作中经常面对和解决的问题,在用户体验至上的今天,解决好应用软件的性能问题能带来非常大的收益. Java作为最流行的编程语言 ...

  7. 立创eda学习笔记二十八:在嘉立创购买pcb板并贴片(smt)

    完整的写一下,分为两部分: 1.下pcb订单 这个可以看之前写的一个博客: 立创eda学习笔记三:pcb购买_Gutie_bartholomew的博客-CSDN博客 补充一下,买pcb可以直接有几个途 ...

  8. 【theano-windows】学习笔记二十——LSTM理论及实现

    前言 上一篇学习了RNN,也知道了在沿着时间线对上下文权重求梯度的时候,可能会导致梯度消失或者梯度爆炸,然后我们就得学习一波比较常见的优化方法之LSTM 国际惯例,参考网址: LSTM Network ...

  9. 立创eda学习笔记二十六:手把手教你使用立创eda的官方教程

    可以通过以下办法找到教程: 1,在软件界面点帮助-使用教程 2,在网站首页-帮助-教程进入 如何使用教程: 这里是一级目录,其实对新手最有用的是前面3个部分,后面的仿真先不看. 常见问题里面不光是讲的 ...

最新文章

  1. 三段式LLVM编译器
  2. VS2017 安装,建议大家都看一下这个在卸载,真人真事,防止扑街
  3. 调用Cython时报错: More than one filename match found for utility code Capsule
  4. 产品 电信nb接口调用_电信NB-IoT云平台数据对接方案——唐山平升电子技术开发有限公司...
  5. facebook机器学习_如何为您的页面创建Facebook Messenger机器人
  6. 81-linux cluster : lvs
  7. delete优化_深入理解JIT和编译优化
  8. oracle 返回hashmap,解决:oracle+myBatis ResultMap 类型为 map 时返回结果中存在 timestamp 时使用 jackson 转 json 报错...
  9. 奥威软件大数据bi_哪家BI软件能做Sql server的数据可视化分析?
  10. 纯命令行linux环境,Ubuntu Server纯命令行环境安装 Dropbox
  11. Android中关于Task的一些认识
  12. 小白学习Python的一点建议
  13. Linux 内核和 Windows 内核有什么区别?
  14. 打印照片显示rpc服务器,打印照片时出现了“RPC服务器不可用”的错误怎么办?...
  15. python 模拟键盘_用Python模拟键盘输入
  16. zheng win 环境搭建
  17. 一个app开发周期是多久?快速开发才是主流
  18. 视频用txt文件播放物联网
  19. 题解:单词排序(水)
  20. cocoscreator 模拟点击

热门文章

  1. 2022/5/22 退役之战: acm山东省省赛银奖 被刻到耻辱柱上的收官之战(心态问题放在第一位)
  2. 项目组 eslint 统一配置及疑难解决
  3. 来体验用软件集2022年支付宝五福,附集五福攻略
  4. UE风格化Day17-天空和云雾/Flowmap的探索
  5. 软件项目管理韩万江版课后习题答案
  6. 地质学与计算机的应用,试述计算机技术在地质工作中的应用
  7. deepinlinux下C语言穷举解决9宫格填数字
  8. 【iCore4 双核心板_uC/OS-II】例程九:消息队列
  9. 小白的 Python 修炼手册:入门篇
  10. mysql在手游中的作用_战神引挚手游数据库解析mysql/mir