STM32 + 移远EC800 4G通信模块数传

一、4G模块简述

EC800M-CN 是移远通信(Quectel)推出的一款高性能、超小尺寸的 LTE Cat 1 无线通信模块,专为 M2M(机器对机器)和 IoT(物联网)应用设计。它具有以下主要特点:

  1. 通信速率

    • 最大下行速率:10 Mbps
    • 最大上行速率:5 Mbps
  2. 封装与设计

    • 超小尺寸:紧凑的设计使其适用于空间有限的应用。
    • 镭雕工艺:提供更高的外观质量和耐用性。镭雕工艺有助于改善模块的散热性能,且信息不易被抹除,适合自动化需求。
  3. 兼容性

    • 封装兼容性:EC800M-CN 在封装上兼容多个系列模块,包括 LTE Standard EC800E-CN、EC800G-CN、EC800N-CN、EC800K-CN 和 EG800K 系列,这使得它在多种设计中具有很高的灵活性。
  4. 网络协议和接口

    • 内置网络协议:支持多种工业标准的网络协议。
    • 接口:集成多个工业标准接口,确保与不同系统的兼容性。
    • 驱动支持:提供多种操作系统的 USB 虚拟串口驱动,包括 Windows(7/8/8.1/10/11)、Linux 和 Android,扩展了应用范围。
  5. 应用领域

    • M2M 和 IoT:广泛应用于如 OTT(Over-the-Top)、跟踪器(Tracker)、POS 终端、数据卡、智能安全、工业级 PDA 等领域。

二、串口配置(stm32f103c8t6 UART2)

//初始化IO 串2
//bound:波特率
void uart2_init(u32 bound)
{//GPIO端口设置GPIO_InitTypeDef GPIO_InitStructure;USART_InitTypeDef USART_InitStructure;NVIC_InitTypeDef NVIC_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);	//使能,GPIOA时钟RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);//USART2USART_DeInit(USART2);  //复位串口2//USART2_TX   PA.2GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; //PA.2GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;	//复用推挽输出GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化PA2//USART2_RX	  PA.3GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入GPIO_Init(GPIOA, &GPIO_InitStructure);  //初始化PA3//Usart1 NVIC 配置NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0 ;//抢占优先级0NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;		//子优先级3NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;			//IRQ通道使能NVIC_Init(&NVIC_InitStructure);	//根据指定的参数初始化VIC寄存器//USART 初始化设置USART_InitStructure.USART_BaudRate = bound;//115200USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式USART_InitStructure.USART_StopBits = USART_StopBits_1;//一个停止位USART_InitStructure.USART_Parity = USART_Parity_No;//无奇偶校验位USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控制USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;	//收发模式USART_Init(USART2, &USART_InitStructure); //初始化串口USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);//开启中断USART_Cmd(USART2, ENABLE);                    //使能串口 }//串口2接收函数
void USART2_IRQHandler(void)                            
{if(USART_GetITStatus(USART2, USART_IT_RXNE)==SET){ec200x_receive_process_event(USART_ReceiveData(USART2));USART_ClearITPendingBit(USART2,USART_IT_RXNE);}if(USART_GetFlagStatus(USART2,USART_FLAG_ORE)==SET){ec200x_receive_process_event(USART_ReceiveData(USART2));USART_ClearFlag(USART2,USART_FLAG_ORE);}
}

三、4G模块

1、4G模块初始化代码

/*****************************************************
下面就是需要修改的地方,修改服务器的IP地址和端口号
*****************************************************/
#define SERVERIP "IP地址"
#define SERVERPORT  端口号/*****************************************************
初始化模块 和单片机连接,获取卡号和信号质量
*****************************************************/
void CSTX_4G_Init(void)
{//打印初始化信息printf("start init EC800X
");//发第一个命令ATE1Uart2_SendStr("ATE1
"); delay_ms(300);printf(buf_uart2.buf);      //打印串口收到的信息strx=strstr((const char*)buf_uart2.buf,(const char*)"OK");//返回OKClear_Buffer();	while(strx==NULL){printf("单片机正在连接模块......
");Clear_Buffer();	Uart2_SendStr("ATE1
"); delay_ms(300);strx=strstr((const char*)buf_uart2.buf,(const char*)"OK");//返回OK}printf("****单片机和模块连接成功*****
");Uart2_SendStr("ATI
");//获取模块的版本delay_ms(300);Clear_Buffer();	Uart2_SendStr("AT+CIMI
");//获取卡号,类似是否存在卡的意思,比较重要。delay_ms(300);strx=strstr((const char*)buf_uart2.buf,(const char*)"460");//返460,表明识别到卡了while(strx==NULL){Clear_Buffer();	Uart2_SendStr("AT+CIMI
");//获取卡号,类似是否存在卡的意思,比较重要。delay_ms(300);strx=strstr((const char*)buf_uart2.buf,(const char*)"460");//返回OK,说明卡是存在的} printf("我的卡号是 : %s 
",buf_uart2.buf+8);Clear_Buffer();	Uart2_SendStr("AT+CGATT?
");//查询激活状态delay_ms(300);strx=strstr((const char*)buf_uart2.buf,(const char*)"+CGATT: 1");//返1Clear_Buffer();	while(strx==NULL){Clear_Buffer();	Uart2_SendStr("AT+CGATT?
");//获取激活状态delay_ms(300);strx=strstr((const char*)buf_uart2.buf,(const char*)"+CGATT: 1");//返回1,表明注网成功}Clear_Buffer();	Uart2_SendStr("AT+CSQ
");//查看获取CSQ值delay_ms(300);strx=strstr((const char*)buf_uart2.buf,(const char*)"+CSQ:");//返回CSQif(strx){printf("信号质量是:%s 注意:信号最大值是31 
",buf_uart2.buf+14);      }IWDG_Feed();//喂狗
}

2、建立TCP链接

void CSTX_4G_CreateTCPSokcet(void)//创建sokcet
{memset(ATSTR,0,BUFLEN);sprintf(ATSTR,"AT+QIOPEN=1,0,"TCP","%s",%d,0,1
",SERVERIP,SERVERPORT);Uart2_SendStr(ATSTR);//创建连接TCP,输入IP以及服务器端口号码 delay_ms(300);strx=strstr((const char*)buf_uart2.buf,(const char*)"+QIOPEN: 0,0");//检查是否登陆成功errcount=0;while(strx==NULL){IWDG_Feed();//喂狗errcount++;strx=strstr((const char*)buf_uart2.buf,(const char*)"+QIOPEN: 0,0");//检查是否登陆成功delay_ms(100);if(errcount>100)     //超时退出死循环 表示服务器连接失败{errcount = 0;break;}}  Clear_Buffer();	
}

3、4G模块发送数据

void CSTX_4G_Senddata(uint8_t *len, uint8_t *data) {memset(ATSTR, 0, BUFLEN);sprintf(ATSTR, "AT+QISEND=0,%u
", *len);Uart2_SendStr(ATSTR);  // 发送 AT 命令delay_ms(300);  // 等待模块反馈 >// 等待模块反馈 >strx = strstr((const char*)buf_uart2.buf, ">");while (strx == NULL) {errcount++;strx = strstr((const char*)buf_uart2.buf, ">");if (errcount > 100) {  // 防止死循环errcount = 0;break;}}Uart2_SendData(data, *len);  // 发送真正的二进制数据delay_ms(300);  // 等待发送完成// 检查是否发送成功strx = strstr((const char*)buf_uart2.buf, "SEND OK");errcount = 0;while (strx == NULL) {errcount++;strx = strstr((const char*)buf_uart2.buf, "SEND OK");delay_ms(100);if (errcount > 100) {  // 超时退出死循环errcount = 0;break;}}Clear_Buffer();  // 清空缓冲区
}

四、用花生壳透传

1、利用花生壳透传

2、开启网络助手

3、打开串口工具

五、结果展示

通过4G透传指定的IP和端口号发送报文数据

整体来说不复杂,但是需要点时间调试。完整工程源码可丝。

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

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

相关文章

标准库以及HAL库——按键控制LED灯代码

按键控制LED本质还是控制GPIO,和点亮一个LED灯没什么区别 点亮一个LED灯:是直接控制输出引脚,GPIO初始化推挽输出即可 按键控制LED:是按键输入信号从而控制输出引脚,GPIO初始化推挽输出一个引脚以外还得加一个GPIO上拉输入 但是…

springboot525基于MVC框架自习室管理和预约系统设计与实现(论文+源码)_kaic

摘 要 传统办法管理信息首先需要花费的时间比较多,其次数据出错率比较高,而且对错误的数据进行更改也比较困难,最后,检索数据费事费力。因此,在计算机上安装自习室管理和预约系统软件来发挥其高效地信息处理的作用&am…

Unity Canvas中显示粒子特效

首先在场景中新建一个粒子特效 修改一下参数 1.改变粒子特效的渲染层级,层级修改为UI层,由UI相机渲染 使用粒子特效的Sorting Layer ID和Order In Layer,Sorting Layer ID设置为UI(如果没有UI层则新建就好了),对UI进行排序 对于要显示在前的UI组件添加Canvas组件,设置O…

Linux下部署Redis集群 - 一主二从三哨兵模式

三台服务器redis一主二从三哨兵模式搭建 最近使用到了redis集群部署,使用一主二从三哨兵集群部署redis,将自己部署的过程中的使用心得分享给大家,希望大家以后部署的过程减少一些坑。 服务器准备 3台服务器 ,确定主redis和从red…

服务器端请求伪造之基本介绍

一.服务器端请求伪造漏洞基础 1.客户端请求 客户端请求指的是由客户端设备(如个人计算机、智能手机、平板电脑等)或软件(浏览器、各种APP)发出的请求,以获取指定的网页、图片、视频或其他资源。比如当用户在浏览器中输…

akamai3.0反爬教程逆向分析9个视频汇总

目录 一、akamai2.0文章二、akamai3.0每月疑似改版点二、9个视频汇总如下 一、akamai2.0文章 文章1cookie反爬之akamai_2.0-上文章2cookie反爬之akamai_2.0-上文章3cookie反爬之akamai_2.0-上文章中akamai2.0对应调试html与js文件 二、akamai3.0每月疑似改版点 详细文字与2.…

2024年12月 Scratch 图形化(二级)真题解析#中国电子学会#全国青少年软件编程等级考试

Scratch图形化等级考试(1~4级)全部真题・点这里 一、单选题(共25题,共50分) 第 1 题 小猫初始位置和方向如下图所示,下面哪个选项能让小猫吃到老鼠?( ) A. B. C.

【74LS160+74LS273DW锁存器8位的使用频率计】2022-7-12

缘由 想知道这个数字频率计仿真哪里出现错误了,一直无法运行哎,如何解决?-运维-CSDN问答

系统思考—信任

《基业长青》作者指出:“在人生的重要十字路口,选择信任是一场赌注。信任带来的好处可能巨大,而失去信任的代价却相对有限。但如果选择不信任,最优秀的人才可能因失望而离开。” 在企业管理中,信任不仅是人际关系的纽…

推理加速:投机采样经典方法

一 SpecInfer 基于模型 SpecInfer([2305.09781] SpecInfer: Accelerating Generative Large Language Model Serving with Tree-based Speculative Inference and Verification) SpecInfer 投机采样利用多个小型模型(SSM)快速生…

深入理解Java中的Set集合:特性、用法与常见操作指南

一、HashSet集合 1.HashSet集合的特点 2.HashSet常用方法 ①:add(Object o):向Set集合中添加元素,不允许添加重复数据。 ②:size():返回Set集合中的元素个数 ③.remove(Object o): 删除Set集合中的obj对…

黑马Java面试教程_P10_设计模式

系列博客目录 文章目录 系列博客目录前言1. 工厂方法模式1.1 概述1.2 简单工厂模式1.2.1 结构1.2.2 实现1.2.3 优缺点 1.3 工厂方法模式1.3.1 概念1.3.2 结构1.3.3 实现1.3.4 优缺点 1.4 抽象工厂模式1.4.1 概念1.4.2 结构1.4.3 实现1.4.4 优缺点1.4.5 使用场景 总结&#xff0…

开源架构的容器化部署优化版

上三篇文章推荐: 开源架构的微服务架构实践优化版(New) 开源架构中的数据库选择优化版(New) 开源架构学习指南:文档与资源的智慧锦囊(New) 我管理的社区推荐:【青云交社区…

SpringCloudAlibaba实战入门之Sentinel服务降级和服务熔断(十五)

一、Sentinel概述 1、Sentinel是什么 随着微服务的流行,服务和服务之间的稳定性变得越来越重要。Sentinel 以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。 一句话概括:sentinel即Hystrix的替代品,官网: https://sentinelguard.io/zh…

【每日学点鸿蒙知识】导入cardEmulation、自定义装饰器、CallState状态码顺序、kv配置、签名文件配置

1、HarmonyOS 无法导入cardEmulation? 在工程entry mudule里的index.ets文件里导入cardEmulation失败 可以按照下面方式添加SystemCapability;在src/main/syscap.json(此文件需要手动创建)中添加如下内容 {"devices": {"gen…

Datawhale AI冬令营(第二期)动手学AI Agent--Task3:学Agent工作流搭建,创作进阶Agent

目录 一、工作流:制作复杂Agent的福音! 二、支付宝百宝箱中工作流介绍 三、设计工作流 3.1 准备功能模块 3.2组合工作流 3.3 模块测试需要注意什么 3.4迭代优化 四、高中学习小助手工作流设计 4.1 选题调研 4.2 功能模块设计 4.3 组合完整工作…

Postman[8] 断言

1.常见的断言类型 status code: code is 200 //检查返回的状态码是否为200 Response body: contain string //检查响应中包含指定字符串包含指定的值 response body:json value check/ /检查响应中其中json的值 Response body: is equal to string …

python openyxl 用法 教程

Python自动化办公:openpyxl教程(基础)-CSDN博客 https://zhuanlan.zhihu.com/p/342422919 https://openpyxl-chinese-docs.readthedocs.io/zh-cn/latest/tutorial.html 列标题,是这一列 对应的单元格的格式,默认是常规,设置之后…

深入解析 Wireshark 的 TLS 设置:应用场景与实操技巧

简述 在网络数据分析中,传输层安全(TLS)协议的流量解密和分析是一项重要的技能。Wireshark 提供了专门的设置选项,帮助用户处理 TLS 流量,例如解密会话、重组分片等。本文将详细解析上图所示的 Wireshark TLS 设置功能…

每天五分钟机器学习:凸集

本文重点 在SVM中,目标函数是一个凸函数,约束集合是一个凸集。因此,SVM问题可以转化为一个凸规划问题来求解。这使得SVM在实际应用中具有较高的计算效率和准确性。 凸集的定义 凸集是指一个集合中的任意两点之间的线段都完全包含在这个集合中。换句话说,给定集合C中的两…