3.20 GM196-高新兴 DTU/RTU 核心板 4G 全网通模块 (来自 TaurusHard 的贡献)
3.20.1 模块来源
资料下载: https://www.domall.cn/doDTU-M01.html
3.20.2 规格参数
工作电压:5~18V
工作电流:500mA@12V
引脚数量:20(常用 VIN、GND、TXD、RXD 等)
工作温度:-30℃~+75°C
支持网络:4G 全网通(Cat.1)
天线接口:IPEX1 代
通信接口:TTL 串口
波特率:默认 115200
模块尺寸:35.5mm×30mm
支持软件协议:TCP/UDP/HTTP/MQTT
3.20.3 模块原理
模块简介
doDTU-M01 是一款 4G Cat.1 全网通 DTU/RTU 模块,支持多种软件协议,尺寸小,稳定可靠。其搭载的通信模组为 GM196。 GM196 是高新兴物联推出的一款高性能、超小 LGA+LCC 封装、超高性价比的 LTE Cat.1 无线通信模组。GM196 支持标准的 Mini PCIe 封装,以满足不同行业产品应用需求。支持 FDD/TDD LTE Cat.1 全网通,兼容 R13 协议, 可实现良好覆盖,具有超低功耗、低延迟以及良好的移动性,使移动性场景业务更简单稳定。GM196 模组支持多种网络协议(TCP/UDP/FTP(S)/HTTP(S)/FILE/MQTT/SSL/TLS 等)拓宽应用范围;同时支持多种功能(远程唤醒、远程升级、WelinkOpen 等);支持双卡双待数据单通、SIM 热插拔、VoLTE 通话,增强不断网的用户体验。GM196 在 M2M 和 IoT 领域可以广泛应用于如移动支付、公网对讲、可穿戴设备、资产追踪、消费电子、智能表计、安防系统等行业。
OneNET 云平台配置步骤
本例以 OneNET 云平台为例演示模块功能。
- 登录 OneNET 官网 https://open.iot.10086.cn/,注册账号并登录。
- 登录成功后点击右上角的“开发者中心”,如下图所示。
- 进入开发者中心后,点击左上角的“全部产品服务”->“基础服务”->“多协议接入”,如下图所示。
- 进入多协议接入界面后,点击“MQTT(旧版)”中的添加产品,如下图所示。
- 在弹出的“添加产品”界面,依次填入产品名称、产品行业、产品类别、产品简介(可选)、联网方式、设备接入协议、操作系统和网络运营商信息。本例中,产品名称填写 TEST、产品行业选择其他、产品类别选择其他、联网方式选择移动蜂窝网络、设备接入协议选择 MQTT(旧版)、操作系统选择无、网络运营商选择移动、电信、联通和其他,如下图所示。
![]() | ![]() |
|---|
- 点击确认后即可创建我们的产品,点击创建好后的产品即可查看产品的详细信息。在产品概况界面,可以看到我们的产品 ID(该参数较重要,接下来会使用),本例中的产品 ID 为 592509,如下图所示。
- 点击左侧的设备列表,点击添加设备,如下图所示。
- 在弹出的“添加新设备”界面,依次填入设备名称、鉴权信息、数据保密性、设备描述(可选)、设备标签(可选)和设备位置(可选)信息。本例中,设备名称填写 TEST、鉴权信息填写 1234、数据保密性选择私有,如下图所示。
- 点击添加后即可创建我们的设备,点击详情界面可以看到设备的详细信息,如下图所示。
- 在设备详情界面,我们需要关注设备 ID 和鉴权信息这两个参数(该参数较重要,接下来会使用),本例中设备 ID 为 1068827865,鉴权信息为 1234,如下图所示。
至此,我们的 OneNET 云平台就搭建完成了,接下来我们进行模块的配置。
DTU/RTU 上位机软件配置步骤
解压资料中的文件“「图形化配置」PC 上位机工具(Win1011).zip”,得到模块配置上位机,打开数传盒子.exe,进入模块配置,以下为软件主界面。
具体使用步骤如下:
- 连接设备
使用 USB-TTL 串口工具(CH340 串口工具等)连接 GM196 模块,线序如下:
连接好后插入电脑(插入电脑前需要安装好 USB-TTL 串口工具驱动),软件会自动识别出串口,在选项框中选取设备使用的串口,再选择当前设备使用的波特率,GM196 默认使用的波特率是 115200,选择 115200。如下图所示。
点击"打开串口"来打开串口,如果打开失败,请检查是否是其他串口设备占用了此串口,或者串口设备是否正确链接至电脑。打开串口成功后,接下来点击“设备配对”,如果配对成功,上位机会识别出设备名称和版本,如下图所示;如果配对失败,请检查串口和波特率等设置,并重复以上内容。
- 数据透传模式配置
由于本例以 OneNET 云平台为例,所以我们选择 OneNET 数据点透传模式进行配置。点击下图中红色方框的开关标志,使能 OneNET 数据点透传模式;点击下图中黄色方框的齿轮标志,进入 OneNET 数据点透传模式详细配置,如下图所示。
透传模式中的 IP/域名和 Port 端口号为 OneNET 的固定参数,我们不需要修改,只需关注产品 id、设备 ID 和鉴权信息这三个参数即可,这三个参数在上一小节已经分别进行了说明(在我们创建自己的 OneNET 产品后,这三个参数可以分别获取到,详见 3.2 小节的黄色加粗标记部分),这里我们对应自己的产品信息逐一填入即可,如下图所示。
- 下载配置
其他参数保持默认即可,配置好所有参数后,点击下载配置,即可下载配置参数。
下载过程中,会出现进度条,如下图所示。
3.20.4 模块测试
配置好参数后,我们关闭上位机软件,打开串口助手,重新插拔 USB-TTL 模块,观察 GM196 模块上电后的打印,当出现“+ONENET_CON:...”时说明模块已连接上 OneNET 云平台,我们刷新云平台网页页面后会发现设备由离线变为了在线状态,如下图所示。
阅读 AT 指令用户手册第九章可知,要与 OneNET 云平台数据点进行数据交互,需要发送 JSON 格式字符串,例如我们要发送一个温度值 32,需要将以下字符串 + 回车换行一起发送给模块。
{"data": 32,"name":"TEMP"}其中,data 为数据点的值,name 为数据点的名称。使用串口助手发送该指令,观察云平台上的数据变化,当出现下图时,说明数据已成功上传至云平台。
3.20.5 测试代码编写
引脚选择
| GM196 | 立创·梁山派 |
|---|---|
| GND | GND |
| VIN | 5V |
| TXD | PB11 |
| RXD | PB10 |
编写步骤
基于 3.20.4 小节的模块测试,我们得出编写代码的思路: 1.等待 GM196 模块连接上 OneNET 云平台; 2.连接上云平台之后每隔一段时间发送一帧 JSON 格式的数据。
本例使用梁山派的 UART2 与 GM196 模块进行交互,根据以上思路编写 gm196.h、gm196.c 和 main.c,详细代码如下。
gm196.h
主要包括接收完成标志位、模块初始化函数和发送函数的定义,代码如下。
/********************************************************************************
* 测试硬件:立创·梁山派开发板GD32F470ZGT6 使用主频200Mhz 晶振25Mhz
* 版 本 号: V1.0
* 修改作者: TaurusHard
* 修改日期: 2023年10月18日
* 功能介绍:
******************************************************************************
* 梁山派软硬件资料与相关扩展板软硬件资料官网全部开源
* 开发板官网:www.lckfb.com
* 技术支持常驻论坛,任何技术问题欢迎随时交流学习
* 立创论坛:club.szlcsc.com
* 其余模块移植手册:https://dri8c0qdfb.feishu.cn/docx/EGRVdxunnohkrNxItYTcrwAnnHe
* 关注bilibili账号:【立创开发板】,掌握我们的最新动态!
* 不靠卖板赚钱,以培养中国工程师为己任
*********************************************************************************/
#ifndef _GM196_H_
#define _GM196_H_
#define REV_OK 0 // 接收完成标志
#define REV_WAIT 1 // 接收未完成标志
uint8_t GM196_Init(void);
uint8_t wait_recv_process(char *res, uint32_t u32_s);
void send_data(char *data);
uint8_t send_data_with_res(char *data, char *res);
#endif2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
gm196.c
主要包括等待接收函数、发送函数、等待接收处理函数、模块初始化函数、UART2 接收中断处理函数的具体实现过程,关键代码为 UART2 接收中断处理函数、等待接收处理函数和模块初始化函数,UART2 接收中断处理函数将 GM196 模块发送的数据接收至缓冲区中;等待接收处理函数负责对接收到的数据进行判断,若在规定时间内(单位为 s)接收到的数据中含有欲接收的字符串则返回 0,否则返回 1;模块初始化函数设置 30s 时间(具体根据当地信号强度设置等待时间)等待 GM196 模块连接上 OneNET 云平台,当 GM196 模块收到含有“+ONENET_CON:”字符串的数据时代表模块已连接上 OneNET 云平台并返回 0,失败则返回 1;代码如下。
/********************************************************************************
* 测试硬件:立创·梁山派开发板GD32F470ZGT6 使用主频200Mhz 晶振25Mhz
* 版 本 号: V1.0
* 修改作者: TaurusHard
* 修改日期: 2023年10月18日
* 功能介绍:
******************************************************************************
* 梁山派软硬件资料与相关扩展板软硬件资料官网全部开源
* 开发板官网:www.lckfb.com
* 技术支持常驻论坛,任何技术问题欢迎随时交流学习
* 立创论坛:club.szlcsc.com
* 其余模块移植手册:https://dri8c0qdfb.feishu.cn/docx/EGRVdxunnohkrNxItYTcrwAnnHe
* 关注bilibili账号:【立创开发板】,掌握我们的最新动态!
* 不靠卖板赚钱,以培养中国工程师为己任
*********************************************************************************/
#include "sys.h"
#include "gm196.h"
#include "systick.h"
#include "uart.h"
#include <string.h>
#include <stdio.h>
unsigned char recv_buf[128];
unsigned short buf_cnt = 0, buf_cntPre = 0;
void buffer_clear(void)
{
memset(recv_buf, 0, sizeof(recv_buf));
buf_cnt = 0;
}
uint8_t wait_recive(void)
{
if(buf_cnt == 0) // 如果接收计数为0 则说明没有处于接收数据中,所以直接跳出,结束函数
return REV_WAIT;
if(buf_cnt == buf_cntPre) // 如果上一次的值和这次相同,则说明接收完毕
{
buf_cnt = 0; // 清0接收计数
return REV_OK; // 返回接收完成标志
}
buf_cntPre = buf_cnt; // 置为相同
return REV_WAIT; // 返回接收未完成标志
}
uint8_t send_data_with_res(char *data, char *res)
{
usart_send_string(UART2, (unsigned char *)data, strlen((const char *)data));
return wait_recv_process(res, 2);
}
void send_data(char *data)
{
usart_send_string(UART2, (unsigned char *)data, strlen((const char *)data));
}
uint8_t wait_recv_process(char *res, uint32_t u32_s)
{
uint32_t time_out = u32_s * 100;
while(time_out--)
{
if(wait_recive() == REV_OK) // 如果收到数据
{
if(strstr((const char *)recv_buf, res) != NULL) // 如果检索到关键词
{
buffer_clear(); // 清空缓存
return 0;
}
}
delay_ms(10);
}
return 1;
}
uint8_t GM196_Init(void)
{
uart2_init(115200);
buffer_clear();
return wait_recv_process("+ONENET_CON:", 30);
}
void UART2_IRQHandler(void)
{
if(usart_interrupt_flag_get(UART2, USART_INT_FLAG_RBNE) == SET) // 接收缓冲区不为空
{
if(buf_cnt >= sizeof(recv_buf))
{
buf_cnt = 0; // 防止溢出
}
recv_buf[buf_cnt++] = usart_data_receive(UART2);
usart_interrupt_flag_clear(UART2, USART_INT_FLAG_RBNE);
}
else
{
}
}2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
main.c
main.c 中编写以下代码,首先是 UART0 和 GM196 模块的初始化,上电后首先等待 GM196 模块连接上 OneNET 云平台,若连接成功则每隔 10s 发送数据至云平台;若连接失败则不发送,代码如下。
/********************************************************************************
* 测试硬件:立创·梁山派开发板GD32F470ZGT6 使用主频200Mhz 晶振25Mhz
* 版 本 号: V1.0
* 修改作者: TaurusHard
* 修改日期: 2023年10月18日
* 功能介绍:
******************************************************************************
* 梁山派软硬件资料与相关扩展板软硬件资料官网全部开源
* 开发板官网:www.lckfb.com
* 技术支持常驻论坛,任何技术问题欢迎随时交流学习
* 立创论坛:club.szlcsc.com
* 其余模块移植手册:https://dri8c0qdfb.feishu.cn/docx/EGRVdxunnohkrNxItYTcrwAnnHe
* 关注bilibili账号:【立创开发板】,掌握我们的最新动态!
* 不靠卖板赚钱,以培养中国工程师为己任
*********************************************************************************/
#include "sys.h"
#include "main.h"
#include "systick.h"
#include <stdio.h>
#include <string.h>
#include "uart.h"
#include "gm196.h"
uint8_t cnt = 0;
uint8_t flag_init_success = 1;
char send_buffer[] = "{\"data\":32,\"name\":\"TEMP\"}";
/*!
\brief main function
\param[in] none
\param[out] none
\retval none
*/
int main(void)
{
nvic_priority_group_set(NVIC_PRIGROUP_PRE2_SUB2); // 优先级分组
systick_config(); // 滴答定时器初始化
usart_gpio_config(115200); // 串口0初始化
flag_init_success = GM196_Init(); // GM196初始化
if(0 == flag_init_success)
{
printf("GM196 Init OK\r\n");
}
else
{
printf("GM196 Init Failed\r\n");
}
while(1)
{
delay_ms(1000);
if(0 == flag_init_success)
{
cnt++;
if(10 == cnt) // 10s
{
cnt = 0;
printf("Send Data!\r\n");
send_data(send_buffer);
}
}
}
}2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
3.20.6 移植验证
将 DAP-Link 连接至电脑 USB 接口,打开串口调试助手,编译代码下载到梁山派开发板后,运行代码,串口打印出“GM196 Init OK”则证明模块初始化成功且连接上 OneNET 云平台,OneNET 云平台设备由离线变为在线状态,打开 OneNET 设备数据流的实时刷新功能,可以看到每隔 10s 串口打印“Send Data!”,且 OneNET 云平台会收到新数据上传,至此模块移植成功。
移植成功代码见下文件。
通过网盘分享的文件:立创·梁山派GD32F470ZGT6开发板【模块移植手册代码】
链接: https://pan.baidu.com/s/1pp44yjD1Dhh7U9iZ2a11IA 提取码: LCKF

