STM32-笔记34-4G遥控灯


 

 4G接线

一、项目需求

        服务器通过4G模块远程遥控开关灯。

二、项目实现

复制项目文件夹38-wifi控制风扇项目

重命名为39-4G遥控点灯

打开项目文件

加载文件

main.c

#include "sys.h"
#include "delay.h"
#include "led.h"
#include "uart1.h"
#include "e840.h"
#include "string.h"int main(void)
{HAL_Init();                         /* 初始化HAL库 */stm32_clock_init(RCC_PLL_MUL9); /* 设置时钟, 72Mhz */led_init();//初始化led灯uart1_init(115200);//这里是跟电脑相连接的串口波特率e840_init(9600);//我这里的e840的波特率为9600// printf("hello word!\r\n");char recv_data[E840_RX_BUF_SIZE];while(1){ e840_receive_data(recv_data);//现在是把接收到的数据传到recv_data这里了if(strstr(recv_data,"ON") != NULL)//判断我们接收到的字符串里面是否有ON这个值,有的话打卡风扇led1_ON();else if(strstr(recv_data,"OFF") != NULL)//没有不打开led1_OFF();delay_ms(10);
//        esp8266_test();
//        delay_ms(500);}
}

e840.c

#include "sys.h"
#include "e840.h"
#include "string.h"
#include "stdio.h"
#include "delay.h"
#include "stdarg.h"uint8_t e840_rx_buf[E840_RX_BUF_SIZE];//定义一个数组,用来保存接收的缓冲区
uint8_t e840_tx_buf[E840_TX_BUF_SIZE];//定义一个数组,用来保存发送的缓冲区
uint16_t e840_cnt = 0,e840_cntPre = 0; //定义一个计数器,和保存计数器原本状态的变量UART_HandleTypeDef e840_handle = {0};void e840_uart_init(uint32_t baudrate)
{e840_handle.Instance = USART2;e840_handle.Init.BaudRate = baudrate;  //波特率e840_handle.Init.Mode = UART_MODE_TX_RX;//收发模式;e840_handle.Init.Parity = UART_PARITY_NONE;//无校验位e840_handle.Init.WordLength = UART_WORDLENGTH_8B;  //字长:8个字长e840_handle.Init.StopBits = UART_STOPBITS_1; //停止位:1个停止位e840_handle.Init.HwFlowCtl = UART_HWCONTROL_NONE; //无硬件流控HAL_UART_Init(&e840_handle);
}void USART2_IRQHandler(void)
{uint8_t receive_data = 0;//这个函数是用来检查特定的UART接口(在这个例子中是e840_handle所代表的UART接口)是否有数据可读if(__HAL_UART_GET_FLAG(&e840_handle,UART_FLAG_RXNE) != RESET)//关注RXNE这个标志位的值是不是不为reset(0){if(e840_cnt >= sizeof(e840_rx_buf))//如果接收的字符长度大于字符缓冲区的长度,则把缓冲区长度置0e840_cnt = 0;//如果RXNE的值为1,证明有数据,所以需要接收数据HAL_UART_Receive(&e840_handle,&receive_data,1,1000);//句柄,接收的数据存放在哪?接收数据的个数,超时时间e840_rx_buf[e840_cnt++] = receive_data;//将接收的数据存放在e840rx_buf数组中//HAL_UART_Transmit(&e840_handle,&receive_data,1,1000);//发送数据:句柄,要发送的数据,发送数据的长度,超时}
}
//这个函数主要用来判断e840cnt有没有动,如果没有动证明接收完成了
uint8_t e840_wait_receive(void)
{if(e840_cnt == 0)//如果cnt为0证明,出现了错误return E840_ERROR;//出现错误if(e840_cnt == e840_cntPre)//判断当前cnt和上一个cnt是否一致,如果是一致的证明数据不动了,传输完成{e840_cnt = 0;//cnt清0return E840_EOK;//数据接收完成}e840_cntPre = e840_cnt;//把当前计数器cnt的值赋给之前计数器return E840_ERROR;//}
//把接收寄存器的内容清空
void e840_rx_clear(void)
{//把接收缓冲器清空memset(e840_rx_buf,0,sizeof(e840_rx_buf));//清空长度e840_cnt = 0;
}
//这个函数在while循环里,来一直判断当前数据是否接收完
uint16_t e840_receive_data(char *recv_data)
{if(e840_wait_receive() == E840_EOK)//判断数据是否接受完整{printf("e840 recv: %s\r\n",e840_rx_buf);//接收完整,打印数据//我们把e840_rx_buf中的内容通过memcpy的方式,全部copy到recv_data中memcpy(recv_data,e840_rx_buf,strlen((const char *)e840_rx_buf));e840_rx_clear();//清除当前接收//返回e840_rx_buf的内容以及长度return strlen((const char*)recv_data);}return 0;
}
//发送数据的函数
void e840_send_data(char *fmt,...)
{va_list ap;uint16_t len;va_start(ap,fmt);vsprintf((char *)e840_tx_buf,fmt,ap);va_end(ap);len = strlen((const char *)e840_tx_buf);HAL_UART_Transmit(&e840_handle,e840_tx_buf,len,100);
}void e840_init(uint32_t baudrate)
{//printf("e840初始化开始...\r\n");//e840串口初始化e840_uart_init(baudrate);}

e840.h

#ifndef __E840_H__
#define __E840_H__#include "sys.h"#define E840_RX_BUF_SIZE         128 //接收的长度
#define E840_TX_BUF_SIZE         64  //发送的长度#define E840_EOK                  0  //宏定义错误代码 ok
#define E840_ERROR                1  //错误
#define E840_ETIMEOUT             2  //超时
#define E840_EINVAL               3  //数据非法void e840_init(uint32_t baudrate);
uint16_t e840_receive_data(char *recv_data);
//void e840_test(void);#endif

注意:

执行结果:

        服务器和4G模块以透传模式相连接,开发板烧录代码,上电,4G模块通电,蓝(电源灯)、黄(模组附着网络灯(SIM))、绿(模组与服务器连接成功)三个指示灯常亮。串口1和电脑通过USB转TTL相连接,并且打开对应串口的串口助手。

        当在服务器中发送信息,可通过透传模式将信息传递给4G模组,4G模组接收到信息,通过RX-TX将信息传递给开发板,该信息执行开发板中代码信息,开发板中的串口1接收到信息,所以,该信息可以在串口助手中查看到,并且,对应LED灯状态改变。

本实验,要注意,串口的波特率和4G模组的波特率,可在main函数中使用正确的波特率。

补充:在本实验中,使用花生壳APP可以将我们的一个内网的IP地址,映射成我们的外网IP地址,然后我们的其他外网的ip就可以与该外网进行合法通信,这个过程叫做内网穿透。

  外网连接(内网穿透)

 内网连接

三、出现的问题

        当使用亿佰特时,选择对应的串口号和波特率之后,打开串口,进入配置,显示进入AT指令模式失败原因?

波特率选择的不对,换个波特率试试

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/503803.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

STM32——系统滴答定时器(SysTick寄存器详解)

文章目录 1.SysTick简介2.工作原理3.SysTick寄存器4.代码延时逻辑5.附上整体代码6.一些重要解释 1.SysTick简介 Cortex-M处理器内集成了一个小型的名为SysTick(系统节拍)的定时器,它属于NVIC的一部分,且可以产生 SysTick异常(异常类型#15)。SysTick为简单的向下计数的24位计数…

数据库模型全解析:从文档存储到搜索引擎

目录 前言1. 文档存储(Document Store)1.1 概念与特点1.2 典型应用1.3 代表性数据库 2. 图数据库(Graph DBMS)2.1 概念与特点2.2 典型应用2.3 代表性数据库 3. 原生 XML 数据库(Native XML DBMS)3.1 概念与…

使用 Conda创建新的环境遇到的问题

下载速度很慢 1、更新 conda update -n base -c defaults conda2、清理缓存 conda clean --all解决方法 方法 1:关闭严格的渠道优先级 检查是否开启了严格渠道优先级: conda config --show channel_priority 如果返回 strict,说明启用了严…

软件23种设计模式完整版[附Java版示例代码]

一、什么是设计模式 设计模式是在软件设计中反复出现的问题的通用解决方案。它们是经过多次验证和应用的指导原则,旨在帮助软件开发人员解决特定类型的问题,提高代码的可维护性、可扩展性和重用性。 设计模式是一种抽象化的思维方式,可以帮助开发人员更好地组织和设计他们…

React+redux项目搭建流程

1.创建项目 create-react-app my-project --template typescript // 创建项目并使用typescript2.去除掉没用的文件夹,只保留部分有用的文件 3.项目配置: 配置项目的icon 配置项目的标题 配置项目的别名等(craco.config.ts&…

nginx-灰度发布策略(基于cookie)

一. 简述: 基于 Cookie 的灰度发布是一种常见的策略,它允许您根据用户的特定 Cookie 值将流量路由到不同的服务版本。这种方法可以确保只有满足条件的用户会看到新版本的功能,从而降低风险并便于监控和回滚。 二. 配置案例: 测…

【HarmonyOS NEXT】鸿蒙应用使用后台任务之长时任务,解决屏幕录制音乐播放等操作不被挂起

【HarmonyOS NEXT】鸿蒙应用使用后台任务之长时任务,解决屏幕录制音乐播放等操作不被挂起 一、前言 1.后台是什么? 了解后台任务和长时任务前,我们需要先明白鸿蒙的后台特性:所谓的后台,指的是设备返回主界面、锁屏、…

怎么用vs编python文件

用vs编写python文件的方法:1、安装python插件,在vs的Extensions扩展中搜索Python,如下: 2、安装完成后,就需要配置一下本地python解释器的路径,这个直接在settings.json文件中设置参数python.pythonPath就可…

C#使用MVC框架创建WebApi服务接口

第一步,使用VS2019新建MVC-Web API应用程序 创建BridgeApi 第二步,运行将生成默认的示例网页,网页Url为 https://localhost:44361/home/index 右键 项目 添加 WebAPI控制器类 添加 我们可以看到App_Start目录下 有三个文件: BundleConfig.cs代表 捆绑文件的引用 有脚本文件…

设计模式与游戏完美开发(3)

更多内容可以浏览本人博客:https://azureblog.cn/ 😊 该文章主体内容来自《设计模式与游戏完美开发》—蔡升达 第二篇 基础系统 第五章 获取游戏服务的唯一对象——单例模式(Singleton) 游戏实现中的唯一对象 在游戏开发过程中…

【工业场景】用YOLOv8实现工业安全帽识别

工业安全帽识别是一项重要的工作安全管理措施,旨在防止工作场所发生头部伤害事故。通过使用YOLOv8等深度学习模型,可以实时准确地检测出工人是否佩戴安全帽,及时发现违规行为,为工人提供更安全的工作环境。 使用YOLOv8实现工业安全…

路由器的转发表

【4-24】 已知路由器R₁ 的转发表如表T-4-24 所示。 表T-4-24 习题4-24中路由器R₁的转发表 前缀匹配 下一跳地址 路由器接口 140.5.12.64/26 180.15.2.5 m2 130.5.8/24 190.16.6.2 ml 110.71/16 ----- m0 180.15/16 ----- m2 190.16/16 ----- ml 默认 11…

打开idea开发软件停留在加载弹出框页面进不去

问题 idea软件点击打开,软件卡在加载弹框进不去。 解决方法 先进入“任务管理器”停止IDEA的任务进程 2.找到IDEA软件保存的本地数据文件夹 路径都是在C盘下面:路径:C:\Users\你的用户名\AppData\Local\JetBrains 删除目录下的文件夹&…

【网络安全 | 漏洞挖掘】HubSpot 全账户接管(万字详析)

未经许可,不得转载。 今天我们将分享一个关于在 Bugcrowd 平台的 HubSpot 公共漏洞赏金计划中实现全账户接管的故事。 文章目录 正文SQL 注入主机头污染(Host Header Poisoning)负载均衡器主机头覆盖(Load Balancer Host Header Override)Referer Header 测试ORIGIN Heade…

[笔记] Jenkins 安装与配置全攻略:Ubuntu 从零开始搭建持续集成环境

随着 DevOps 流程的普及,持续集成(CI)和持续交付(CD)已成为现代软件开发中不可或缺的一部分。Jenkins 作为一款开源的自动化服务器,广泛应用于 CI/CD 管道的构建与管理。它不仅支持多种编程语言和工具链&am…

精选2款.NET开源的博客系统

前言 博客系统是一个便于用户创建、管理和分享博客内容的在线平台,今天大姚给大家分享2款.NET开源的博客系统。 StarBlog StarBlog是一个支持Markdown导入的开源博客系统,后端基于最新的.Net6和Asp.Net Core框架,遵循RESTFul接口规范&…

Keepalived 进阶秘籍:全方位配置优化

文章目录 1.sysctl.conf参数优化2. limits参数优化3. global_defs模块区域4.vrrp_script模块区域5.vrrp_instance VI_1实例定义配置模块区域6. virtual_server模块区域7.Keepalived与Heartbeat、Corosync比较 前言: 作为一台Keepalived服务器,有必要对内…

51单片机——中断(重点)

学习51单片机的重点及难点主要有中断、定时器、串口等内容,这部分内容一定要认真掌握,这部分没有学好就不能说学会了51单片机 1、中断系统 1.1 概念 中断是为使单片机具有对外部或内部随机发生的事件实时处理而设置的,中断功能的存在&#…

rabbitmq——岁月云实战笔记

1 rabbitmq设计 生产者并不是直接将消息投递到queue,而是发送给exchange,由exchange根据type的规则来选定投递的queue,这样消息设计在生产者和消费者就实现解耦。 rabbitmq会给没有type预定义一些exchage,而实际我们却应该使用自己定义的。 1.1 用户注册设计 用户在…

基于Python的投资组合收益率与波动率的数据分析

基于Python的投资组合收益率与波动率的数据分析 摘要:該文通过研究马科维茨的投资组合模型,并将投资组合模型应用到包含6只金融股票的金融行业基金中。首先通过开源的财经接口Tushare获取股票原始数据,接着利用数据分析的黄金组合库&#xf…