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

ops/2024/12/30 18:41:34/

一、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.ppmy.cn/ops/145909.html

相关文章

Linux 基本指令

目录 1.常见指令 1.1 ls指令 1.2 pwd指令 1.3 cd指令 1.4 touch指令 1.5 mkdir指令 1.6 rm和rmdir指令 1.7 man指令 1.8 cp指令 1.9 mv指令 ​编辑 1.10 cat指令 1.11 more指令 1.12 less指令 1.13 head指令 1.14.tail指令 1.15 时间相关的指令 1.16 cal…

云手机群控能用来做什么?

随着云手机的发展,云手机群控技术逐渐从小众的游戏多开工具,发展为涵盖多个领域的智能操作平台。不论是手游搬砖、短视频运营,还是账号养成等场景,云手机群控都展现出了强大的应用潜力。本文将为大家详细解析云手机群控的应用场景…

瑞芯微全新芯片平台RK3506优势详解,高集成低功耗,为工业而生 触觉智能测评

RK3506是瑞芯微Rockchip在2024年第四季度全新推出的Arm嵌入式芯片平台,三核Cortex-A7单核Cortex-M0多核异构设计,CPU频率达1.5Ghz, M0 MCU为200Mhz。 而RK3506芯片平台下的工业级芯片型号RK3506J,具备-40-85℃的工业宽温性能、发热量小&#…

10分钟掌握项目管理核心工具:WBS、甘特图、关键路径法全解析

一、引言 在项目管理的广阔天地里,犹如一场精心编排的交响乐演奏,每个乐器、每个音符都需精准配合才能奏响美妙乐章。而 WBS(工作分解结构)、甘特图、关键路径法无疑是这场交响乐中的关键乐章,它们从不同维度为项目管…

全国硕士研究生入学考试(考研)择校择专业之择专业主要因素

全国硕士研究生入学考试(考研)择校择专业之择专业主要因素 在中国,研究生入学考试(考研)不仅涉及选择合适的院校,更关键的是选择适合自身发展的专业。择专业的决策直接影响着未来的学术深造和职业发展。因…

Dockerfile基础指令

1.FROM 基于基准镜像(建议使用官方提供的镜像作为基准镜像,相对安全一些) 举例: 制作基准镜像(基于centos:lastest) FROM cenots 不依赖于任何基准镜像 FROM scratch 依赖于9.0.22版本的tomcat镜像 FROM…

Android view 基本的绘制流程

回答思路 概述 View 的绘制流程是从 ViewRootImpl 的 performTraversals() 方法开始的,分为 测量(Measure)、布局(Layout) 和 绘制(Draw) 三个阶段。 它是一个递归的过程,从根 View…

ch.h:38:10:致命错误: rpc/rpc.h:没有那个文件或目录38 I#include <rpc/rpc.h>

1.报错如下 编译器在编译时找不到 rpc/rpc.h 头文件 2.解决报错 通过确认问题、检查库安装、配置环境变量、查看实际路径、查阅解决方案并实施,在检查 RPC 库已安装并配置环境变量无效后,通过查阅资料发现问题源于路径不一致,最终将 /usr/i…