基于stm32的4G模块点灯实验

led模块功能封装

#include "led.h"
#include "sys.h"//初始化GPIO函数
void led_init(void)
{GPIO_InitTypeDef gpio_initstruct;//打开时钟__HAL_RCC_GPIOB_CLK_ENABLE();//调用GPIO初始化函数gpio_initstruct.Pin  = GPIO_PIN_8 | GPIO_PIN_9;gpio_initstruct.Mode = GPIO_MODE_OUTPUT_PP;gpio_initstruct.Pull = GPIO_PULLUP;//上拉gpio_initstruct.Speed= GPIO_SPEED_FREQ_HIGH;HAL_GPIO_Init(GPIOB,&gpio_initstruct);//关闭LEDled1_off();led3_off();}//点亮LED的函数void led1_on(void)
{//由电路图可知,将GPIO拉低HAL_GPIO_WritePin(GPIOB,GPIO_PIN_8,GPIO_PIN_RESET);}
//熄灭LED1的函数void led1_off(void)
{//由电路图可知,将GPIO拉低HAL_GPIO_WritePin(GPIOB,GPIO_PIN_8,GPIO_PIN_SET);}
//翻转LED1状态的函数void led1_toggle(void)
{HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_8);}void led3_on(void)
{//由电路图可知,将GPIO拉低HAL_GPIO_WritePin(GPIOB,GPIO_PIN_9,GPIO_PIN_RESET);}
//熄灭LED1的函数void led3_off(void)
{//由电路图可知,将GPIO拉低HAL_GPIO_WritePin(GPIOB,GPIO_PIN_9,GPIO_PIN_SET);}
//翻转LED1状态的函数void led3_toggle(void)
{HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_9);}

4G模块功能代码及指令

内网穿透

1. 内网穿透

内网穿透的原理就像在内网和外网之间搭建了一座桥梁,使得外部网络可以穿过内网的障碍,直接访问内部 的设备。

2. 花生壳配置

案例演示

 右边是通过官网的方式来连接的

4G模块

上位机配置: 1. 选择端口号(根据自己的端口选择) 2. 选择波特率(默认115200) 3. 打开串口 4. 点击进入配置,上位机会自动发送AT指令进行配置 5. 读取参数,此命令可以读取4g模块的详细信息,并打印带基本信息栏(这一步很重要,否则在第九步的 时候会出现问题) 6. 选择链路1 7. 默认是连接亿佰特的服务器 这边我们需要修改成我们自己的,具体从花生壳获取(是一串域名,或者 IP地址,他都支持,根据自己获取到的填写就可以) 8. 输入从花生壳获取的端口号 9. 点击保存配置(对应第五步,我们很多的配置需要获取到模块默认配置,保存时才会不改变) 10. 点击重启(重启后默认进入透传模式,无需在做其他操作,直接链接到串口助手上即可发送与接收信 息)

不用自己敲指令,有专门的上位机

服务端

进入AT模式后在链接2中,复制映射IP时不能复制端口,否则,外网与内容能连接但是不能通讯通过接口

重启之后就默认进入透传模式

TCPC代表端口

填入的是映射出来的地址

 4G模块可以左边能接收到,但是右边收不到

网络调试助手的TCP client打不开

解决问题1

联系快速的断连

有时候是连接的但是确实断的

解决方法

网络调试2 助手在协议类型为TCP Client打不开的情况则,需连接WiFi模块的wifi使其处在同一网段下,如果电脑连接路由器家庭WiFi则与服务器不是同一网段。

就会出现连接不了的情况

功能代码

头文件

#include "sys.h"
#include "e840.h"
#include "string.h"
#include "delay.h"
#include "stdarg.h"/* UART收发缓冲大小 */
#define E840_RX_BUF_SIZE            128
#define E840_TX_BUF_SIZE            64/* 错误代码 */
#define E840_EOK                     0      /* 没有错误 */
#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);uint8_t e840_tx_buf[E840_TX_BUF_SIZE];
uint8_t e840_rx_buf[E840_RX_BUF_SIZE]; uint16_t e840_cnt = 0 ,e840_cntPre = 0; /* es840接收缓冲区 */UART_HandleTypeDef e840_handle;             /* esp8266句柄 */
#include "sys.h"
#include "e840.h"
#include "string.h"
#include "delay.h"
#include "stdarg.h"
uint8_t e840_tx_buf[E840_TX_BUF_SIZE];
uint8_t e840_rx_buf[E840_RX_BUF_SIZE]; uint16_t e840_cnt = 0 ,e840_cntPre = 0; /* es840接收缓冲区 */UART_HandleTypeDef e840_handle;             /* esp8266句柄 *//*** @brief       串口1初始化函数* @param       baudrate: 波特率, 根据自己需要设置波特率值* @retval      无*/
void e840_uart_init(uint32_t baudrate)//正常会有启动的流程只是作为一个串口的初始化
{/*esp8266 初始化设置*/e840_handle.Instance = USART2;                                         /* USART1 */e840_handle.Init.BaudRate = baudrate;                                  /* 波特率 */e840_handle.Init.WordLength = UART_WORDLENGTH_8B;                      /* 字长为8位数据格式 */e840_handle.Init.StopBits = UART_STOPBITS_1;                           /* 一个停止位 */e840_handle.Init.Parity = UART_PARITY_NONE;                            /* 无奇偶校验位 */e840_handle.Init.HwFlowCtl = UART_HWCONTROL_NONE;                      /* 无硬件流控 */e840_handle.Init.Mode = UART_MODE_TX_RX;                               /* 收发模式 */HAL_UART_Init(&e840_handle);                                           /* HAL_UART_Init()会使能e840 */
}/*** @brief       esp8266接收缓冲区清除* @param       无* @retval      无*/
void e840_rx_clear(void)
{memset(e840_rx_buf, 0, sizeof(e840_rx_buf));                          /* 清空接收缓冲区 */e840_cnt = 0;                                                       /* 接收计数器清零 */
}/*** @brief       串口1中断服务函数* @note        在此使用接收中断及空闲中断,实现不定长数据收发* @param       无* @retval      无*/
void USART2_IRQHandler(void)
{uint8_t receive_data = 0;   if(__HAL_UART_GET_FLAG(&e840_handle, UART_FLAG_RXNE) != RESET){        /* 获取接收RXNE标志位是否被置位 */if(e840_cnt >= sizeof(e840_rx_buf))                            /* 如果接收的字符数大于接收缓冲区大小, */e840_cnt = 0;                                               /* 则将接收计数器清零 */HAL_UART_Receive(&e840_handle, &receive_data, 1, 1000);            /* 接收一个字符 */e840_rx_buf[e840_cnt++] = receive_data;                        /* 将接收到的字符保存在接收缓冲区 */}if (__HAL_UART_GET_FLAG(&e840_handle, UART_FLAG_IDLE) != RESET)        /* 获取接收空闲中断标志位是否被置位 */{printf("recv: %s\r\n", e840_rx_buf);                               /* 将接收到的数据打印出来 */e840_rx_clear();__HAL_UART_CLEAR_IDLEFLAG(&e840_handle);                           /* 清除UART总线空闲中断 */}
}uint8_t e840_wait_receive(void)
{if(e840_cnt == 0)return E840_ERROR;if(e840_cnt == e840_cntPre){e840_cnt = 0;return E840_EOK;}e840_cntPre = e840_cnt;return E840_ERROR;
}uint8_t e840_send_command(char *cmd,char *res)//发送一个指令去   在指定时间内返回回来 否则没有接收到一个返回值
{uint8_t timeout_out = 250;e840_rx_clear(); //防止忍心内的数据影响HAL_UART_Transmit(&e840_handle,(uint8_t *)cmd,strlen(cmd),100);//发送命令 cmd在这里是一个uint8_t的数据 长度 阻塞的值//等待while(timeout_out--)//不停的等待{if(e840_wait_receive() == E840_EOK){if(strstr((const char*)e840_rx_buf, res) != NULL)//判断是否又有期待的字符串return E840_EOK;}delay_ms(10);}return E840_ERROR;//否则接收错误}//只是内部处理外部是不知道的用不了,为了便于外部能获取RX_BUF接收缓冲区内容接收到多少的数据,可以将接收到的字符,对代码进行修改
//复制一份给TX_BUF
//接收的函数通返回值传出来,这样RX_bUF就能传出来 memcpy(recv_data,)uint16_t e840_receive_data(char *recv_data)
{if(e840_wait_receive() == E840_EOK){printf("esp8266 recv: %s\r\n", e840_rx_buf);memcpy(recv_data, e840_rx_buf,strlen((const char *)e840_rx_buf));e840_rx_clear(); //清空之前一样的,清空为下一次数据做准备,用recv_data作为返回值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)//所以增加新添加一个
{e840_uart_init(baudrate);}		//测试函数

main函数代码

#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(115200);printf("helloworld!\r\n");char recv_data[E840_RX_BUF_SIZE];//接收传入参数while(1){ e840_receive_data(recv_data);//接收到数据tcp服务器传输过来的字符串if(strstr(recv_data, "ON") != NULL)//判断字符串有ON,打开风扇					led1_on();else if(strstr(recv_data, "OFF") != NULL)led1_off();delay_ms(10);}
}

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

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

相关文章

Linux基本指令一眼看懂(简洁表示)

首先先声明是简单表示,如果要全指令有链接 1. ls 指令 ls [选项] [文件/目录]常用选项: -l: 以长格式列出文件和目录的详细信息。 -a: 显示所有文件,包括隐藏文件(以.开头的文件)。 -h: 以人类可读的格式显示文件大小。 示例: …

基于stm32的esp8266的WIFI控制风扇实验

实验案例WIFI控制风扇 项目需求 电脑通过esp8266模块远程遥控风扇。 项目框图 ​ 风扇模块封装 #include "sys.h" #include "fan.h"void fan_init(void) {GPIO_InitTypeDef gpio_initstruct;//打开时钟…

数据库知识点整理

DDL DDL-数据库操作 show databases ------------ 查看所有数据库 select database(); ----------查看当前数据库 create database 数据库名;---- 创建数据库 use 数据库名; --------------使用数据库 drop database 数据库名;--…

day02_计算机常识丶第一个程序丶注释丶关键字丶标识符

计算机常识 计算机如何存储数据 计算机世界中只有二进制。那么在计算机中存储和运算的所有数据都要转为二进制。包括数字、字符、图片、声音、视频等。 进制 进制也就是进位计数制,是人为定义的带进位的计数方法 实例: // 在java 中 可以使用不同…

[PHP]Undefined index错误只针对数组

1、示例一 <?php $a null; var_dump($a[name]); 结果&#xff1a;无报错 2、示例二 <?php $a []; var_dump($a[name]);结果&#xff1a;报错

【JavaEE初阶】深入理解网络编程—使用UDP协议API实现回显服务器

前言 &#x1f31f;&#x1f31f;本期讲解关于TCP/UDP协议的原理理解~~~ &#x1f308;感兴趣的小伙伴看一看小编主页&#xff1a;GGBondlctrl-CSDN博客 &#x1f525; 你的点赞就是小编不断更新的最大动力 &#x1f386;那么废话不…

JMeter 中两大高级线程组的区别与应用

一、JMeter 中的高级线程组概述 最近群里的测试小伙伴在问在 JMeter 中&#xff0c;“jpgc - Ultimate Thread Group”和“jpgc - Stepping Thread Group 阶梯加压”有哪些区别和实际应用场景有哪些&#xff1f;所以这里也跟大家分享一下 JMeter 作为一款强大的性能测试工具&a…

Java项目-基于Springboot的应急救援物资管理系统项目(源码+说明).zip

作者&#xff1a;计算机学长阿伟 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、ElementUI等&#xff0c;“文末源码”。 开发运行环境 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringBoot、Vue、Mybaits Plus、ELementUI工具&#xff1a;IDEA/…

基于SpringBoot网上超市的设计与实现(论文+源码)_kaic

摘 要 网络技术和计算机技术发展至今&#xff0c;已经拥有了深厚的理论基础&#xff0c;并在现实中进行了充分运用&#xff0c;尤其是基于计算机运行的软件更是受到各界的关注。加上现在人们已经步入信息时代&#xff0c;所以对于信息的宣传和管理就很关键。因此超市商品销售信…

100 种下划线 / 覆盖层动画 | 终极 CSS(层叠样式表)集合

还在为你的菜单项和链接寻找动画效果而感到疲惫吗&#xff1f; 不用再找了&#xff01;这里列出了 100 多种不同的动画。从简单的到更复杂的&#xff0c;你肯定能找到自己想要的。 无需 SVG&#xff08;可缩放矢量图形&#xff09;&#xff0c;无需 JavaScript&#xff08;脚…

小白也能剪出优秀视频:四大视频剪辑工具推荐!

无论是社交媒体上的短视频分享&#xff0c;还是专业制作的长视频内容&#xff0c;视频剪辑工具都扮演着至关重要的角色。今天&#xff0c;就让我们来探讨几款市面上流行的视频剪辑工具。 福昕视频剪辑 直达链接&#xff1a;www.pdf365.cn/foxit-clip/ 操作教程&#xff1a;立…

使用Diffutoon把视频转换成动漫风格,无需部署,开箱即用

无论是图片动漫转换以及视频动漫转换&#xff0c;我们前期也介绍过相关的模型&#xff0c;但是其模型输出的动漫视频不是有瑕疵&#xff0c;就是动漫效果不唯美&#xff0c;今天介绍一个modelscope社区开源的动漫风格转换模型Diffutoon。 Diffutoon模型接受视频作为输入&#x…

【C语言】循环中断break

在循环使用过程中&#xff0c;可能遇到某些情况需要终止循环。比如按座位查找一位学生&#xff0c;循环查找&#xff0c;找到时可以直接停止。后续的循环将不再执行。 break;只跳出一层循环 例子中的素数判断&#xff0c;查找到根号n停止&#xff1a;一个合数等于两个数的乘积…

新手必须掌握的Linux命令

1.1 常用系统工作命令 echo [linuxprobelocalhost /]$ echo $SHELL /bin/bash 使用$变量的方式提取SHELL的值&#xff0c;并输出到到屏幕上 date [linuxprobelocalhost /]$ date -s "20170901 8:30:00" 将系统时间设置为 reboot ----系统重启命令poweroff --…

JavaWeb Servlet--09深入:注册系统05---动态搜索栏

动态搜索栏 分析&#xff1a;在显示用户信息的表单里有一个下拉框选择用户的信息&#xff0c;一个文本框进行输入&#xff0c;一个按钮就行搜索&#xff0c;在下拉框选择了性别或许姓名的某一个包含字就会返回所有满足的用户。在controller层进行接收选择的搜索条件&#xff0…

Starrocks部署前期准备

前提条件 硬件要求 CPU StarRocks 依靠 AVX2 指令集充分发挥其矢量化能力。因此&#xff0c;在生产环境中&#xff0c;强烈建议您将 StarRocks 部署于 x86 架构 CPU 的服务器上。 您可以在终端中运行以下命令来检查 CPU 是否支持 AVX2 指令集&#xff1a; cat /proc/cpuin…

【深度学习】RNN的简单实现

目录 1.RNNCell 2.RNN 3.RNN_Embedding 1.RNNCell import torchinput_size 4 hidden_size 4 batch_size 1idx2char [e, h, l, o] x_data [1, 0, 2, 2, 3] # 输入&#xff1a;hello y_data [3, 1, 2, 3, 2] # 期待&#xff1a;ohlol# 独热向量 one_hot_lookup [[1, …

如何使用Python合并Excel文件中的多个Sheet

在日常工作中&#xff0c;我们经常会遇到需要处理多个Excel工作表&#xff08;Sheet&#xff09;的情况。比如&#xff0c;一个Excel文件中包含了一个月内每天的数据&#xff0c;每个工作表代表一天。有时候&#xff0c;为了方便分析&#xff0c;我们需要将这些分散的数据合并到…

数据结构单向链表的插入和删除(一)

链表 一、链表结构&#xff1a; &#xff08;物理存储结构上不连续&#xff0c;逻辑上连续&#xff1b;大小不固定&#xff09;二、单链表&#xff1a;三、单项链表的代码实现&#xff1a;四、开发可用的链表&#xff1a;四、单链表的效率分析&#xff1a; 一、链表结构&#x…

Javaweb基础-vue

Vue.js Vue是一套用于构建用户界面的渐进式框架。 起步 引入vue <head><script src"static/js/vue2.6.12.min.js"></script> </head> 创建vue应用 <body> <div id"index"><p>{{message}}</p> </div>…