利用stm32+app inventor与esp8266通信
本章实验的目的是将手机连接上ESP8266提供的WIFI网络,打开自定义的app连接ESP8266的ip地址及端口号,实现app与ESP8266模块的通信,进而达到app控制32开发板的目的,并将开发板上面的数据返回到app上显示出来。
关于stm32与esp8266之间的通信,在前面的文章中已经介绍得差不多了,本文章主要介绍的是app inventor的制作,然后生成app二维码,最后在手机端下载app,进而实现通过WIFI局域网控制stm32开发板,当然关于stm32与esp8266之间的一些东西也会粗略讲一下。
本章所用到的器件如下:
STM32F103ZET6最小系统板
ESP8266-01S模块
USB转microUSB数据线
四根杜邦线
连接如下:
32板3.3v----------->ESP8266的3.3v
32板GND---------->ESP8266的GND
32板的PA2-------->ESP8266的RX
32板的PA3-------->ESP8266的TX
先附上32程序的主代码:
#include "stdio.h"
#include "delay.h"
#include "led.h"
#include "usart.h"
#include "serial.h"
#include "esp8266.h"
/* AT指令返回值的结尾没有\r\n这样的回车换行符,
* 而在串口调试助手中,需要MCU输出\r\n给串口调试助手才能刷新缓冲区把字符显示出来,
* 同时这个\r\n还起到回车换行的目的*/
/* AT指令的结尾处必须是\r\n*/
/* serial.h中的usart1_send_usart2函数用于没有USB转TLL模块的人使用,
* 此函数作用是利用串口1发送AT指令给串口2,串口2将AT指令发送给ESP8266,实现对ESP8266的AT指令配置,
* 当然,如果你有USB转TTL模块的话,可以直接将ESP8266与USB转TTL模块直连,然后在串口调试助手里面直接配置AT指令*/
extern u8 esp_sipsend1[];
extern u8 esp_sipsend2[];
int main(void)
{
delay_init(); //延时函数初始化
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
uart_init(115200); //串口1初始化为115200
Uart2_Init(115200); //串口2初始化为115200
LED_Init(); //初始化与LED连接的硬件接口
Esp8266_Init();
while(1)
{
usart1_send_usart2(); //利用串口1发送AT指令给串口2,从而达到配置ESP8266的目的,并且让模块的返回值在串口1打印出来
if(Data_Compare((u8 *)"LEDK")) //点亮板上的led
{
led(1);
Clear_Buf();
Uart_SendStr(USART1, (u8 *)"led is open\r\n");
Uart_SendStr(USART2, esp_sipsend1); //利用串口2给esp8266发送AT+CIPSEND指令,告诉它下一次将发送具体数据
Usart2_Receive_Data(USART1); //将串口2接收到的AT+CIPSEND指令返回的数据显示在串口1上
Uart_SendStr(USART2, (u8 *)"led is open\r\n"); //发送具体数据给esp8266,让他转发到app上
}
else if(Data_Compare((u8 *)"LEDG")) //关闭板上的led
{
led(0);
Clear_Buf();
Uart_SendStr(USART1, (u8 *)"led is close\r\n");
Uart_SendStr(USART2, esp_sipsend2); //利用串口2给esp8266发送AT+CIPSEND指令,告诉它下一次将发送具体数据
Usart2_Receive_Data(USART1); //将串口2接收到的AT+CIPSEND指令返回的数据显示在串口1上
Uart_SendStr(USART2, (u8 *)"led is close\r\n"); //发送具体数据给esp8266,让他转发到app上
}
}
}
此代码中的serial.h包含几个自定义函数,其函数的作用见其右边的注释,代码如下所示:
#ifndef __SERIAL_H
#define __SERIAL_H
#include "stdio.h"
#include "sys.h"
#include "delay.h"
#include "string.h"
#include "usart.h"
#define tbuf 100
void Uart2_Init(u32 bound); //初始化串口2
void Clear_Buf(void); //清除缓冲区数据
void Uart_SendStr(USART_TypeDef* USARTx, u8 *s); //往某一个串口发送指定字符串
void Usart2_Receive_Data(USART_TypeDef* USARTx); //将串口2返回的数据发送给串口1进行显示
u8 Data_Compare(u8 *p); //指定字符串与缓存数组数据进行数据比较
void usart1_send_usart2(void); //利用串口1发送AT指令给串口2,从而达到配置ESP8266的目的,并且让模块的返回值在串口1打印出来
#endif
其中Usart2_Receive_Data函数是用于接收esp8266返回的数据并在串口1进行显示,因为串口2是与esp8266进行连接的,只要串口2正确发送AT指令给esp8266,esp8266都会返回响应值,由于手头上没有USB转TTL模块,只能用这种方法来观察esp8266模块的返回值。
而usart1_send_usart2函数的作用是利用串口调试助手发送AT指令给串口1,串口1接收到数据之后,将数据通过串口2发送给esp8266模块,达到通过串口调试助手发送AT指令配置esp8266模块的目的,之所以用这种方式,其原因是手头上没有USB转TTL模块,才出此下策。
假如手头上有USB转TTL模块,上面的两个函数大可不必要,直接将USB转TTL直连上esp8266模块,然后USB端插在电脑上,利用串口调试助手即可直接发送AT指令去配置esp8266模块以及显示模块的返回值。
主函数中的Esp8266_Init函数是对esp8266进行一系列的配置,使得能够被app客户端所连接上,其详细代码如下所示:
#include "esp8266.h"
u8 esp_at[] = "AT\r\n"; //握手连接指令,返回"OK"
u8 esp_cifsr[] = "AT+CIFSR\r\n"; //本机IP地址查询指令
u8 esp_cipsend[] = "AT+CIPSEND=6\r\n"; //设置发送数据长度
u8 esp_test[] = "sunny\r\n"; //数据内容
u8 esp_rst[] = "AT+RST\r\n"; //软件复位
u8 esp_cwmode[] = "AT+CWMODE=2\r\n"; //设置ESP8266的工作模式2(AP模式,WIFI模块作为热点),返回"OK"或者"no change"
u8 esp_cwsap[] = "AT+CWSAP=\"ESP8266_TEST\",\"1234567890\",1,4\r\n";//设置WIFI的名称、密码、通道号、加密方式(4-WPA_WPA2_PSK)
u8 esp_cipmux[] = "AT+CIPMUX=1\r\n"; //打开多连接
u8 esp_cipserver[] = "AT+CIPSERVER=1,8080\r\n"; //建立TCP服务器,开放端口8080,端口号可以改成其他的例如8086等等
u8 esp_cipsto[] = "AT+CIPSTO=2880\r\n"; //设置服务器超时时间为2880s,也就是连接服务器过程中可以等待的时间
extern u8 RX_num; //接收计数变量
extern u8 RX_buffer[tbuf];
void Esp8266_Init(void)
{
Uart_SendStr(USART2, esp_cwmode); //设置ESP8266的工作模式2 AP,返回"OK"或者"no change"
Usart2_Receive_Data(USART1); //将串口2收到的数据发送给串口1进行显示
Uart_SendStr(USART1, (u8 *)"\r\nOK,set mode as AP with ESP8266!\r\n----------\r\n");
Uart_SendStr(USART2, esp_rst); //设置ESP8266的工作模式后需要复位以生效该模式
Usart2_Receive_Data(USART1); //复位后可能会返回一堆乱码
Uart_SendStr(USART1, (u8 *)"\r\nOK,set RST success!\r\n----------\r\n");
Uart_SendStr(USART2, esp_cwsap); //设置WIFI的名称及密码
Usart2_Receive_Data(USART1); //将串口2收到的数据发送给串口1进行显示
Uart_SendStr(USART1, (u8 *)"\r\nOK,set cwsap success!\r\n----------\r\n");
Uart_SendStr(USART2, esp_cipmux); //设置多连接(多路连接模式)
Usart2_Receive_Data(USART1); //将串口2收到的数据发送给串口1进行显示
Uart_SendStr(USART1, (u8 *)"\r\nOK,set cipmux success!\r\n----------\r\n");
Uart_SendStr(USART2, esp_cipserver); //设置wifi模块为TCP服务器模式,并配置端口为8080
Usart2_Receive_Data(USART1); //将串口2收到的数据发送给串口1进行显示
Uart_SendStr(USART1, (u8 *)"\r\nOK,set server success!\r\n----------\r\n");
Uart_SendStr(USART2, esp_cipsto); //设置服务器超时时间为2880s
Usart2_Receive_Data(USART1); //将串口2收到的数据发送给串口1进行显示
Uart_SendStr(USART1, (u8 *)"\r\nOK,set cipsto success!\r\n----------\r\n");
Uart_SendStr(USART2, esp_cifsr); //获取本机IP地址
Usart2_Receive_Data(USART1); //将串口2收到的数据发送给串口1进行显示
Uart_SendStr(USART1, (u8 *)"\r\nOK,get ip address success!\r\n----------\r\n");
}
至于其中的AT指令,网上随便找一下都有一大堆关于AT指令的详细解释,这里就不再过多解释,而其他的函数,也没有什么好讲的,至此,stm32代码部分就到这里了。
接着进行app的设计,本章app的设计采用的是app inventor。
APP INVENTOR由谷歌实验室开发,后移交麻省理工学院,是一款可视化编程环境,采用搭积木的方式快速建立应用程序,并且可以结合AI伴侣,极其便利的在手机上进行测试和应用。
APP INVENTOR是完全基于网页的在线编程工具,国内外都有一些可用的服务器。
麻省理工学院的服务器登录地址:http://appinventor.mit.edu/explore/
广州服务器登录地址:http://app.gzjkw.net/login
推荐使用国内的广州服务器。

可以用QQ登录,登录后创建项目就可以进入编程界面。

中间显示的就是手机屏幕,通过拖拽工具到手机屏幕,就可以开始编程了,目前只支持Android手机。
为了便于编程调试可以在手机上安装AI伴侣,下载地址可以通过点击菜单栏 帮助->AI伴侣信息 打开下载帮助页。

通过手机扫描图中二维码即可下载AI伴侣,在程序调试时,在服务器端选择菜单栏 连接->AI伴侣 弹出连接二维码和6位编码,在对应的手机AI伴侣中输入6位编码,或扫描二维码,就可以与服务器建立连接,开始调试程序了,同时只要你的网页端app界面改变,相应的在手机端AI伴侣上的界面也会相应实时更新。

而在此WIFI通信app的设计过程中,需要用到tcp连接插件,也就是一个扩展插件,需要导入到app inventor中才能使用tcp连接到esp8266模块上提供的wifi,此插件的链接如下:app inventor扩展插件
上图中所创建的app界面都是用左边那些基本的控件以及扩展插件,其逻辑设计图如下所示:

此逻辑设计也非常简单,只是利用左边的一些功能块进行拼凑而来的,关于更多详细的app inventor语法,网上搜索也是一大堆,这里就不再过多介绍。至此,app的设计基本完成,之后就要进行app的生成了,点击菜单栏的打包apk->打包apk并显示二维码,此时会生成此app的一个二维码,通过打开手机上的AI伴侣app,然后利用AI伴侣上面的扫描二维码去扫描生成的app二维码,扫描后会自动跳到默认游览器去安装此app,安装并打开此app,通过在新app上面输入ESP8266的ip地址及端口号(ip地址可通过执行esp8266初始化函数时在串口调试助手上面打印出来,而端口号则是前面AT+CIPSERVER=1,8080中的8080端口号),然后进行连接,连接成功后,在发送区域输入:LEDK后点击send!,此时会将字符串“LEDK”发送到ESP8266模块上,模块收到信息后通过串口2返回给MCU,MCU接到数据后与程序中设定的字符串进行比较,如果一致则执行相应的操作指令,并将MCU上的数据返回到app上面显示出来。
附上app inventor制作的app项目链接:app_inventor项目
附上整个stm32项目通信代码链接:stm32+app inventor+esp8266通信代码
代码要的下方留言邮箱我会第一时间发给你们的,有什么问题也可以下面评论!
我构建了两个需要相互通信和发送文件的Rails应用程序。例如,一个Rails应用程序会发送请求以查看其他应用程序数据库中的表。然后另一个应用程序将呈现该表的json并将其发回。我还希望一个应用程序将存储在其公共(public)目录中的文本文件发送到另一个应用程序的公共(public)目录。我从来没有做过这样的事情,所以我什至不知道从哪里开始。任何帮助,将不胜感激。谢谢! 最佳答案 无论Rails是什么,几乎所有Web应用程序都有您的要求,大多数现代Web应用程序都需要相互通信。但是有一个小小的理解需要你坚持下去,网站不应直接访问彼此
文章目录1.开发板选择*用到的资源2.串口通信(个人理解)3.代码分析(注释比较详细)1.主函数2.串口1配置3.串口2配置以及中断函数4.注意问题5.源码链接1.开发板选择我用的是STM32F103RCT6的板子,不过代码大概在F103系列的板子上都可以运行,我试过在野火103的霸道板上也可以,主要看一下串口对应的引脚一不一样就行了,不一样的就更改一下。*用到的资源keil5软件这里用到了两个串口资源,采集数据一个,串口通信一个,板子对应引脚如下:串口1,TX:PA9,RX:PA10串口2,TX:PA2,RX:PA32.串口通信(个人理解)我就从串口采集传感器数据这个过程说一下我自己的理解,
MIMO技术的优缺点优点通过下面三个增益来总体概括:阵列增益。阵列增益是指由于接收机通过对接收信号的相干合并而活得的平均SNR的提高。在发射机不知道信道信息的情况下,MIMO系统可以获得的阵列增益与接收天线数成正比复用增益。在采用空间复用方案的MIMO系统中,可以获得复用增益,即信道容量成倍增加。信道容量的增加与min(Nt,Nr)成正比分集增益。在采用空间分集方案的MIMO系统中,可以获得分集增益,即可靠性性能的改善。分集增益用独立衰落支路数来描述,即分集指数。在使用了空时编码的MIMO系统中,由于接收天线或发射天线之间的间距较远,可认为它们各自的大尺度衰落是相互独立的,因此分布式MIMO
LL库和HAL库简介LL:Low-Layer,底层库HAL:HardwareAbstractionLayer,硬件抽象层库LL库和hal库对比,很精简,这实际上是一个精简的库。LL库的配置选择如下:在STM32CUBEMX中,点击菜单的“ProjectManager”–>“AdvancedSettings”,在下面的界面中选择“AdvancedSettings”,然后在每个模块后面选择使用的库总结:1、如果使用的MCU是小容量的,那么STM32CubeLL将是最佳选择;2、如果结合可移植性和优化,使用STM32CubeHAL并使用特定的优化实现替换一些调用,可保持最大的可移植性。另外HAL和L
功能需求:主机使用一个串口,与两个从机进行双向通信,主机向从机发送数据,从机能够返回数据,由于结构限制,主机与从机之间只有3根线(电源、地、数据线),并且从机上没有设物理的电源开关,需要通过与主机连接的数据线来控制开机,总结如下:1、数据线只有1根2、能够双向通信3、主机能够控制从机开机4、主机可以单独向1个从机发数据,也可以同时向两个从机发送数据根据需求,设计出如下电路:工作原理分析:VCC_24V_IN、GND、LINE_L(LINE_R)三根线接线连接到从机,电源开启电路是从机内部的电源控制。开机的逻辑:*主机先上电,LINE_L因为主机的R1上拉而有高电平,使Q6导通,Q5的G极电压被
目录一、ESP32简单介绍二、ESP32Wi-Fi模块介绍三、ESP32Wi-Fi编程模型四、ESP32Wi-Fi事件处理流程 五、ESP32Wi-Fi开发环境六、ESP32Wi-Fi具体代码七、ESP32Wi-Fi代码解读6.1主程序app_main7.2自定义代码wifi_init_sta()八、ESP32Wi-Fi连接验证8.1测试方法8.2服务器模拟工具sscom58.3测试代码8.4测试结果前言为了开发一款亚马逊物联网产品,开始入手ESP32模块。为了能够记录自己的学习过程,特记录如下操作过程。一、ESP32简单介绍ESP32是一套Wi-Fi(2.4GHz)和蓝牙(4.2)双模解决方
有道无术,术尚可求,有术无道,止于术。本系列SpringBoot版本3.0.4本系列SpringSecurity版本6.0.2本系列SpringAuthorizationServer版本1.0.2源码地址:https://gitee.com/pearl-organization/study-spring-security-demo文章目录前言1.OAuth2AuthorizationServerMetadataEndpointFilter2.OAuth2AuthorizationEndpointFilter3.OidcProviderConfigurationEndpointFilter4.N
文章目录前言核心逻辑配置iSH安装Python创建Python脚本配置启动文件测试效果快捷指令前言iOS快捷指令所能做的操作极为有限。假如快捷指令能运行Python程序,那么可操作空间就瞬间变大了。iSH是一款免费的iOS软件,它模拟了一个类似Linux的命令行解释器。我们将在iSH中运行Python程序,然后在快捷指令中获取Python程序的输出。核心逻辑我们用一个“获取当前日期”的Python程序作为演示(其实快捷指令中本身存在“获取当前日期”的操作,因而此需求可以不用Python,这里仅仅为了演示方便),核心代码如下。>>>importtime>>>time.strftime('%Y-%
在我的代码中,我需要使用各种算法(包括CRC32)对文件进行哈希处理。因为我还在Digest系列中使用其他加密哈希函数,所以我认为为它们维护一个一致的接口(interface)会很好。为了记录,我确实找到了digest-crc,一颗完全符合我要求的gem。问题是,Zlib是标准库的一部分,并且有一个我想重用的CRC32工作实现。此外,它是用C编写的,因此它应该提供与digest-crc相关的卓越性能,后者是纯ruby实现。实现Digest::CRC32一开始看起来非常简单:%w(digestzlib).each{|f|requiref}classDigest::CRC32一切正常:
我正在尝试在我的机器上安装win32-apigem,但在构建native扩展时我遇到了一些问题:$geminstallwin32-api--no-ri--rdocTemporarilyenhancingPATHtoincludeDevKit...Buildingnativeextensions.Thiscouldtakeawhile...C:\Programs\dev_kit\bin\make.exe:***Couldn'treservespaceforcygwin'sheap,Win32error0ERROR:Errorinstallingwin32-api:ERROR:Failed