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

  金牌会员 | 2024-12-29 02:07:18 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 806|帖子 806|积分 2418

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

  • 通信速率

    • 最大下行速率:10 Mbps
    • 最大上行速率:5 Mbps

  • 封装与设计

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

  • 兼容性

    • 封装兼容性:EC800M-CN 在封装上兼容多个系列模块,包括 LTE Standard EC800E-CN、EC800G-CN、EC800N-CN、EC800K-CN 和 EG800K 系列,这使得它在多种设计中具有很高的机动性。

  • 网络协议和接口

    • 内置网络协议:支持多种工业标准的网络协议。
    • 接口:集成多个工业标准接口,确保与差别体系的兼容性。
    • 驱动支持:提供多种使用体系的 USB 捏造串口驱动,包括 Windows(7/8/8.1/10/11)、Linux 和 Android,扩展了应用范围。

  • 应用范畴

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

二、串口设置(stm32f103c8t6 UART2)
  1. //初始化IO 串2
  2. //bound:波特率
  3. void uart2_init(u32 bound)
  4. {
  5.     //GPIO端口设置
  6.     GPIO_InitTypeDef GPIO_InitStructure;
  7.                 USART_InitTypeDef USART_InitStructure;
  8.                 NVIC_InitTypeDef NVIC_InitStructure;
  9.                  
  10.                 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);        //使能,GPIOA时钟
  11.                 RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);//USART2
  12.                 USART_DeInit(USART2);  //复位串口2
  13.          //USART2_TX   PA.2
  14.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; //PA.2
  15.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  16.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;        //复用推挽输出
  17.     GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化PA2
  18.    
  19.     //USART2_RX          PA.3
  20.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
  21.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入
  22.     GPIO_Init(GPIOA, &GPIO_InitStructure);  //初始化PA3
  23.    //Usart1 NVIC 配置
  24.     NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;
  25.                 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0 ;//抢占优先级0
  26.                 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;                //子优先级3
  27.                 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                        //IRQ通道使能
  28.                 NVIC_Init(&NVIC_InitStructure);        //根据指定的参数初始化VIC寄存器
  29.   
  30.    //USART 初始化设置
  31.                 USART_InitStructure.USART_BaudRate = bound;//115200
  32.                 USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式
  33.                 USART_InitStructure.USART_StopBits = USART_StopBits_1;//一个停止位
  34.                 USART_InitStructure.USART_Parity = USART_Parity_No;//无奇偶校验位
  35.                 USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控制
  36.                 USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;        //收发模式
  37.     USART_Init(USART2, &USART_InitStructure); //初始化串口
  38.                
  39.     USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);//开启中断
  40.     USART_Cmd(USART2, ENABLE);                    //使能串口
  41. }
  42. //串口2接收函数
  43. void USART2_IRQHandler(void)                           
  44. {
  45.     if(USART_GetITStatus(USART2, USART_IT_RXNE)==SET)
  46.     {
  47.         ec200x_receive_process_event(USART_ReceiveData(USART2));
  48.         USART_ClearITPendingBit(USART2,USART_IT_RXNE);
  49.     }
  50.     if(USART_GetFlagStatus(USART2,USART_FLAG_ORE)==SET)
  51.     {
  52.         ec200x_receive_process_event(USART_ReceiveData(USART2));
  53.         USART_ClearFlag(USART2,USART_FLAG_ORE);
  54.     }
  55. }
复制代码
三、4G模块
1、4G模块初始化代码
  1. /*****************************************************
  2. 下面就是需要修改的地方,修改服务器的IP地址和端口号
  3. *****************************************************/
  4. #define SERVERIP "IP地址"
  5. #define SERVERPORT  端口号
  6. /*****************************************************
  7. 初始化模块 和单片机连接,获取卡号和信号质量
  8. *****************************************************/
  9. void CSTX_4G_Init(void)
  10. {
  11.                 //打印初始化信息
  12.                 printf("start init EC800X
  13. ");
  14.                 //发第一个命令ATE1
  15.     Uart2_SendStr("ATE1
  16. ");
  17.     delay_ms(300);
  18.                 printf(buf_uart2.buf);      //打印串口收到的信息
  19.     strx=strstr((const char*)buf_uart2.buf,(const char*)"OK");//返回OK
  20.     Clear_Buffer();       
  21.     while(strx==NULL)
  22.     {
  23.             printf("单片机正在连接模块......
  24. ");
  25.         Clear_Buffer();       
  26.         Uart2_SendStr("ATE1
  27. ");
  28.         delay_ms(300);
  29.         strx=strstr((const char*)buf_uart2.buf,(const char*)"OK");//返回OK
  30.     }
  31.                 printf("****单片机和模块连接成功*****
  32. ");
  33.                 Uart2_SendStr("ATI
  34. ");//获取模块的版本
  35.                 delay_ms(300);
  36.                 Clear_Buffer();       
  37.                
  38.     Uart2_SendStr("AT+CIMI
  39. ");//获取卡号,类似是否存在卡的意思,比较重要。
  40.     delay_ms(300);
  41.     strx=strstr((const char*)buf_uart2.buf,(const char*)"460");//返460,表明识别到卡了
  42.     while(strx==NULL)
  43.     {
  44.         Clear_Buffer();       
  45.         Uart2_SendStr("AT+CIMI
  46. ");//获取卡号,类似是否存在卡的意思,比较重要。
  47.         delay_ms(300);
  48.         strx=strstr((const char*)buf_uart2.buf,(const char*)"460");//返回OK,说明卡是存在的
  49.     }
  50.                 printf("我的卡号是 : %s
  51. ",buf_uart2.buf+8);
  52.                 Clear_Buffer();       
  53.                
  54.                 Uart2_SendStr("AT+CGATT?
  55. ");//查询激活状态
  56.                 delay_ms(300);
  57.                 strx=strstr((const char*)buf_uart2.buf,(const char*)"+CGATT: 1");//返1
  58.                 Clear_Buffer();       
  59.                 while(strx==NULL)
  60.                 {
  61.                                 Clear_Buffer();       
  62.                                 Uart2_SendStr("AT+CGATT?
  63. ");//获取激活状态
  64.                                 delay_ms(300);
  65.                                 strx=strstr((const char*)buf_uart2.buf,(const char*)"+CGATT: 1");//返回1,表明注网成功
  66.                 }
  67.                
  68.                
  69.                 Clear_Buffer();       
  70.                 Uart2_SendStr("AT+CSQ
  71. ");//查看获取CSQ值
  72.                 delay_ms(300);
  73.     strx=strstr((const char*)buf_uart2.buf,(const char*)"+CSQ:");//返回CSQ
  74.                 if(strx)
  75.                 {
  76.                                
  77.                                 printf("信号质量是:%s 注意:信号最大值是31
  78. ",buf_uart2.buf+14);      
  79.                 }
  80.                 IWDG_Feed();//喂狗
  81. }
复制代码
2、建立TCP链接
  1. void CSTX_4G_CreateTCPSokcet(void)//创建sokcet
  2. {
  3.                 memset(ATSTR,0,BUFLEN);
  4.                 sprintf(ATSTR,"AT+QIOPEN=1,0,"TCP","%s",%d,0,1
  5. ",SERVERIP,SERVERPORT);
  6.     Uart2_SendStr(ATSTR);//创建连接TCP,输入IP以及服务器端口号码
  7.     delay_ms(300);
  8.     strx=strstr((const char*)buf_uart2.buf,(const char*)"+QIOPEN: 0,0");//检查是否登陆成功
  9.           errcount=0;
  10.                 while(strx==NULL)
  11.                 {
  12.                            IWDG_Feed();//喂狗
  13.                                 errcount++;
  14.                                 strx=strstr((const char*)buf_uart2.buf,(const char*)"+QIOPEN: 0,0");//检查是否登陆成功
  15.                                 delay_ms(100);
  16.                                 if(errcount>100)     //超时退出死循环 表示服务器连接失败
  17.                                
  18.         {
  19.             errcount = 0;
  20.             break;
  21.         }
  22.                 }  
  23.      Clear_Buffer();       
  24. }
复制代码
3、4G模块发送数据
  1. void CSTX_4G_Senddata(uint8_t *len, uint8_t *data) {
  2.     memset(ATSTR, 0, BUFLEN);
  3.     sprintf(ATSTR, "AT+QISEND=0,%u
  4. ", *len);
  5.     Uart2_SendStr(ATSTR);  // 发送 AT 命令
  6.     delay_ms(300);  // 等待模块反馈 >
  7.     // 等待模块反馈 >
  8.     strx = strstr((const char*)buf_uart2.buf, ">");
  9.     while (strx == NULL) {
  10.         errcount++;
  11.         strx = strstr((const char*)buf_uart2.buf, ">");
  12.         if (errcount > 100) {  // 防止死循环
  13.             errcount = 0;
  14.             break;
  15.         }
  16.     }
  17.     Uart2_SendData(data, *len);  // 发送真正的二进制数据
  18.     delay_ms(300);  // 等待发送完成
  19.     // 检查是否发送成功
  20.     strx = strstr((const char*)buf_uart2.buf, "SEND OK");
  21.     errcount = 0;
  22.     while (strx == NULL) {
  23.         errcount++;
  24.         strx = strstr((const char*)buf_uart2.buf, "SEND OK");
  25.         delay_ms(100);
  26.         if (errcount > 100) {  // 超时退出死循环
  27.             errcount = 0;
  28.             break;
  29.         }
  30.     }
  31.     Clear_Buffer();  // 清空缓冲区
  32. }
复制代码
四、用花生壳透传
1、使用花生壳透传

2、开启网络助手

3、打开串口工具

五、效果展示
通过4G透传指定的IP和端口号发送报文数据

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

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表