当前位置: 首页 > news >正文

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指令模式失败原因?

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

相关文章:

STM32-笔记34-4G遥控灯

4G接线 一、项目需求 服务器通过4G模块远程遥控开关灯。 二、项目实现 复制项目文件夹38-wifi控制风扇项目 重命名为39-4G遥控点灯 打开项目文件 加载文件 main.c #include "sys.h" #include "delay.h" #include "led.h" #include "ua…...

被催更了,2025元旦源码继续免费送

“时间从来不会停下,它只会匆匆流逝。抓住每一刻,我们才不会辜负自己。” 联系作者免费领💖源💖码。 三联支持:点赞👍收藏⭐️留言📝欢迎留言讨论 更多内容敬请期待。如有需要源码可以联系作者免…...

Java(day1)

注释 在Java中注释分为单行注释、多行注释还有文档注释 //我是单行注释/*我 是多行 注释 *//** 我是文档注释*/ 关键字 关键字:是被Java赋予了特定含义的英文单词 特点:关键字的字母都是c 在常用的代码编辑器中关键字都有特殊的高亮标记 在这个里…...

PDF文件提示-文档无法打印-的解决办法

背景信息 下载了几个签名的PDF文件,想要打印纸质版,结果打印时 Adobe Acrobat Reader 提示【文档无法打印】: 解决办法 网上的方案是使用老版本的PDF阅读器, 因为无法打印只是一个标识而已。 PDF文件不能打印的五种解决方案-zhihu 这些方…...

ubuntu操作系统安装SSH服务

1、更新仓库 sudo apt-get update 2、安装SSH服务 #安装SSH服务 apt-get install openssh-server#启用SSH服务 service ssh start#查看SSH服务运行状态 service ssh status 3、修改SSH配置文件 sudo vi /etc/ssh/sshd_config 4、开启ssh端口 sudo ufw allow ssh 5、重启SSH…...

Beamer-LaTeX学习(教程批注版)【1】

该文档总体由beamer-latex的教程而来,由耳东小白以自身学习路径整理。因其中要点基本按照教程的顺序和结构整理,故而不能称之为完全原创,但也不是翻译,更不是抄袭,是个人自学笔记和批注,其中添加了小白个人…...

IIS设置IP+端口号外网无法访问的解决方案

在IIS将站点设置为IP端口访问,假设端口为8080,设好后,服务器上可以访问,外网无法访问。 通常是端口8080没有加入【入站规则】的缘故,将8080端口加入【入站规则】即可,操作如下: 一、ctrlr 输入 …...

Markdown段落的空行缩进用法

Markdown段落的空行缩进用法。 前言语法详解●正文●段落●不分段换行●缩进 使用场景及实例小结其他文章快来试试吧🥰 Markdown段落,分割线的用法 👈点击这里也可查看 前言 段落由一句或多句连续的文本组成,通过一个或多个空行…...

[paddle] 非线性拟合问题的训练

利用paddlepaddle建立神经网络,模拟有限个数据的非线性拟合 本文仍然考虑 f ( x ) sin ⁡ ( x ) x f(x)\frac{\sin(x)}{x} f(x)xsin(x)​ 函数在区间 [-10,10] 上固定数据的拟合。 import paddle import paddle.nn as nn import numpy as np import matplotlib.…...

每日一学——监控工具(Grafana)

2.2 Grafana 2.2.1 数据源配置 嘿,各位小伙伴们!既然我们已经有了Prometheus这位超级英雄来帮我们收集数据,那么接下来我们就需要一位艺术家来把这些枯燥的数据变成美丽的图画。这就是Grafana出场的时候了!Grafana是一款非常流行…...

FreshTomato 路由器固件常见配置以及踩坑记录

本文首发于只抄博客,欢迎点击原文链接了解更多内容。 前言 在上一篇文章《网件 R6400 梅林固件恢复官方固件后刷入 FreshTomato》中,我将网件 R6400 刷入了 FreshTomato 固件,目前已经使用了大半个月了,稳定性比起 380.70_0-X7.9…...

ubuntu 使用samba与windows共享文件[注意权限配置]

在Ubuntu上使用Samba服务与Windows系统共享文件,需要正确配置Samba服务以及相应的权限。以下是详细的步骤: 安装Samba 首先,确保你的Ubuntu系统上安装了Samba服务。 sudo apt update sudo apt install samba配置Samba 安装完成后&#xff0c…...

使用 httputils + chronicle-bytes 实现金融级 java rpc

1、认识 chronicle-bytes Chronicle-Bytes 是一个类似于 Java NIO 的 ByteBuffer 的高效字节操作库,但它提供了许多扩展功能。这个项目由 OpenHFT 开发并维护,旨在提供高性能、低延迟的数据处理解决方案。Chronicle-Bytes 设计用于高频率交易和其他对性…...

软件工程期末复习(一)

题目复习 单选题 软件产品的核心特性是什么? A. 物质性 B. 逻辑性 C. 可复制性 D. 消耗性 正确答案:B 单选题 在软件开发过程中,哪个环节最接近于传统制造业中的“生产”过程? A. 需求分析 B. 编码 C. 测试 D. 研制&#xff08…...

element ui 组件 时间选择器出现转换问题的解决办法

在使用时间选择器添加数据是会出现转换失败问题 vue中代码为: 解决办法: 在el-date-picker中添加 format 和 value-format...

报错:websocket注入为null,已解决!

错误截图 原因分析: WebSocket 在 Spring 框架中的注入问题是由其生命周期与 Spring 容器的作用域不一致引起的。spring管理的都是单例(singleton),和 websocket (多对象)相冲突。如果你的WebSocket 处理类…...

.e01, ..., .e0n的分卷压缩包怎么解压

用BandiZip,这些分卷压缩中还有一个.exe的文件,这个不是可执行文件,是一个解压缩的开头。 安装好bandiZip后,右键这个.exe文件 点击打开就是开始解压了: 最后解压后是这些。然后一个个再次解压....

四年前的计划,青涩但坚韧

回看四年前写的目标,做的计划,特别感慨,当时的我无法想到现在正在做的事情。 一个契机,群里有个朋友说在写五年规划,让我想到五年前刚毕业不久也写过类似的东西,当时写的是三年学习计划,那是202…...

【人工智能】人工智能与大模型

人工智能与大模型的结合正在深刻改变多个行业和领域的格局。 1. 人工智能 (AI) 人工智能指的是使计算机或机器具备模拟人类智能的能力,包括学习、推理、问题解决、自然语言处理、视觉感知等。AI的发展可以分为几个阶段: 弱人工智能 (Narrow AI)&#…...

小波与傅里叶变换在去噪效果上的对比分析-附Matlab源程序

👨‍🎓 博主简介:博士研究生 🔬 超级学长:超级学长实验室(提供各种程序开发、实验复现与论文指导) 📧 个人邮箱:easy_optics126.com 🕮 目 录 摘要一、…...

Luma AI 简单几步生成视频

简单几步生成视频 登录我们的 AceDataPlatform 网站,按照下图所示即可生成高质量的视频,同时,我们也提供了简单易用的 API 方便集成调用,可以查看 Luma API了解详情 技术介绍 我们使用了 Luma 的技术,实现了上面的图…...

AfuseKt1.4.4 | 刮削视频播放器,支持阿里云盘和自动海报墙

AfuseKt是一款功能强大的安卓端在线视频播放器,广泛兼容多种平台如阿里云盘、Alist、WebDAV、Emby、Jellyfin等,同时也支持本地存储视频文件的播放。其特色功能包括自动抓取影片信息生成海报墙展示,充分利用设备硬件进行高清视频流畅播放&…...

深入理解计算机中的补码、反码、原码

问题: 我们每天用的钟表,其实只有1~12这12个数字,但我们日常会说13点、17点之类的。 问:13点在钟表上哪个位置? 答:很简单嘛,1点的位置。 你不觉得奇怪吗,为啥13点会和1点在同一个位…...

Scratch教学作品 | 白水急流——急流勇进,挑战反应极限! ‍♂️

今天为大家推荐一款刺激又好玩的Scratch冒险作品——《白水急流》!由AgentFransidium制作,这款作品将带你体验惊险的急流救援任务,帮助那位“睡着的疯狂人”安全穿越湍急水域!想要挑战自己的反应极限?快来试试吧&#…...

Px4 V2.4.8飞控Mavlink命令控制说明

首先,可以使用两种方法连接飞控,使用虚拟机(LINUX)或使用地面站(QGC)连接。 在px4的代码文件位置打开命令终端,输入连接命令: ./Tools/mavlink_shell.py 在控制台使用help来获取所有…...

Linux(Ubuntu24.04)源码编译安装VTK7.1.1记录

VTK(Visualization Toolkit)是一个开源的3D可视化开发工具包,用于开发可视化和图形处理应用程序。VTK提供了一系列的算法和工具,用于创建、渲染和处理复杂的3D图形和数据。VTK由C编写,并提供了Python、Java和Tcl等语言…...

【Go学习】-01-4-项目管理及协程

【Go学习】-01-4-项目管理及协程 1 项目管理1.1 包1.1.1 包的基本概念1.1.2 包的导入1.1.3 包的导入路径1.1.4 包的引用格式 1.2. go mod1.2.1 项目中使用 2 协程并发2.1 并发2.2 Goroutine2.2.1 使用2.2.2 GMP2.2.2.1 Golang “调度器” 的由来2.2.2.2 Go 语言的协程 goroutin…...

ES_如何设置ElasticSearch 8.0版本的匿名访问以及https_http模式的互相切换

总结: 设置匿名访问,只需要设置xpack.security.authc.anonymous.username和xpack.security.authc.anonymous.roles参数就行,设置好后,可以匿名访问也可以非匿名访问,但是非匿名访问的情况下必须保证用户名和密码正确 取…...

PySide6 SQLite3 做的 电脑组装报价系统

一、数据库结构说明 1. 配件类别表 (component_categories) 字段名类型说明约束category_idINTEGER类别IDPRIMARY KEY, AUTOINCREMENTcategory_nameTEXT类别名称NOT NULL, UNIQUEdescriptionTEXT类别描述 2. 配件表 (components) 字段名类型说明约束component_idINTEGER配件…...

逻辑回归(Logistic Regression) —— 机器学习中的经典分类算法

1. 逻辑回归简介 逻辑回归是一种线性分类模型,常用于二分类问题。它通过学习特征权重,将输入映射为0 到 1 之间的概率值,并根据阈值将样本归入某一类别。逻辑回归使用Sigmoid 函数将线性结果转化为概率。 尽管名字中有“回归”,…...