GD32 4G模块通信调试记录

GD32 4G模块通信调试记录

本篇博文介绍一下移远EG800AK系列4G模组与GD32通信的调试过程。

4G模块介绍

  • EG800AK-CN 是移远通信专为 M2M 和 IoT 领域而设计的超小尺寸 LTE Cat 1 bis 无线通信模块,支持最大下行速率10 Mbps 和最大上行速率 5 Mbps,超小尺寸,超高性价比。同时,EG800AK-CN在封装上兼容LTE Standard EC800E-CN、EC800G-CN、EC800M-CN、EC800K-CN、EG800W-CN、EG800K系列和 EG810M系列模块。

  • EG800AK-CN采用镭雕工艺,具有外观精美、金属质感强、散热更好、信息不容易被抹除、更能适应自动化需求等优点。

  • EG800AK-CN内置丰富的网络协议,集成多个工业标准接口,并支持多种驱动和软件功能(如 Windows 10/11、Linux、Android 等操作系统下的 USB 转串口驱动),极大地拓展了其在 M2M 和 IoT 领域的应用范围,如追踪器、POS、IPC、数据卡、智能安全以及工业级 PDA 等。

    复制代码
    超小尺寸,专为 M2M 和 IoT 应用设计,尤其是小尺寸终端的需求
    支持 DFOTA 远程在线升级,降低后期运维成本
    支持 Wi-Fi Scan(可选)
    支持 GNSS(可选)*
    超高性价比

![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/e79097b276a54b3dab2673f9aecde6f9.png

电路参考

8pin Usim接口

6pin Usim接口

串口

串口与主芯片通信

程序

硬件相关AT指令

AT+QPOWD 关闭模块

(U)SIM 卡相关命令

AT+CIMI 查询 IMSI

bash 复制代码
AT+CIMI
460023210226023 //查询 ME 中的(U)SIM 卡的 IMSI。
OK

AT+CSQ 查询信号强度


bash 复制代码
AT+CSQ=?
+CSQ: (0-31,99),(0-7,99)

AT+CGATT PS 域附着或去附着

查询

bash 复制代码
AT+CGATT=1 //附着到 PS 域。
OK
AT+CGATT=0 //从 PS 域分离。
OK
AT+CGATT? //查询当前 PS 域状态。
+CGATT: 0
OK

启动TCP连接透传模式

TCP连接命令
bash 复制代码
AT+QIOPEN=1,0,"TCP","36.137.226.30",34064,0,2\r\n

目标IP:36.137.226.30

目标端口号:34064

程序设计

配置

1、读写

读写函数设计理念是在发送命令前清除串口缓存,然后发送命令,然后读取4G模块返回的结果。匹配目标结果,如果匹配上了则返回1,匹配失败则返回0;超时读取失败也返回0。

可以根据自己串口读写函数来设计读写接口,如果没有串口缓存的话,可以跳过这一步。

bash 复制代码
static uint8_t Proto_M4G_Cmd(char* str, const char *ExpRcvStr, uint32_t timeOutMs)
{
	uint8_t i, buf[100], length=0;
	do
	{
		uint8_t tmpbuf[32];
		if(0 == drv_usart_read(M4G_COM , tmpbuf, 32, 10))
		{
			break;
		}
	}while(1);//串口读空
	
	for(i=0; i<1; i++)
	{
		if(drv_usart_write(M4G_COM, (uint8_t*)str, strlen(str), 10))
		{
			memset(buf,0,sizeof(buf));
			length = drv_usart_read(M4G_COM, buf, 100, timeOutMs);		
			if((length)&&(length<100))
			{
				if(strstr((char *)buf, ExpRcvStr) !=NULL)
				{
					return 1;
				}
			}
		}
	}
	return 0;
}

2、断开连接

bash 复制代码
uint8_t Proto_M4G_discon(void)
{
	Proto_M4G_Cmd("+++", "OK\r\n", 200);
	osDelay(1000);
	if(1 == Proto_M4G_Cmd("AT+QICLOSE=0\r\n", "OK\r\n", 200))
	{
		return 1;
	}
	return 0;
}

3、初始化程序

初始化时,首先确认进入了命令模式,连接已经断开,AT指令下发能够生效。

然后再测试AT指令;

再查询是否有卡;

然后就是查询卡信号;

再查询卡附着;

然后再启动TCO透传模式,成功则连接上服务器。

注意:每个步骤如果返回失败最多重复5次,就执行下一个步骤,如果成功则直接进行下一个步骤。如果5次TCP连接都失败了,返回第一步重新进行配置。

bash 复制代码
uint8_t Proto_M4G_init(uint8_t *pServer, uint32_t pPort)
{
	static uint8_t init_step = 0, recount = 0;
	char cmd[128];
	
	if(recount>5)
	{
		init_step = 0;
	}
	switch(init_step)
	{
		case 0:	//重连时确保断开了连接
		{
			if(1 == Proto_M4G_discon())
			{
				recount   = 0;
				init_step = 1;
			}
		}
		case 1:	//进入AT命令模式并确保成功
		{
			if(1 == Proto_M4G_Cmd("AT\r\n", "OK\r\n", 200))
			{
				recount   = 0;
				init_step = 2;
			}
			break;
		}
		case 2:	//查询是否有卡
		{
			recount++;
			if(1 == Proto_M4G_Cmd("AT+CIMI\r\n", "OK\r\n", 200))
			{
				recount   = 0;
				init_step = 3;
			}
			break;
		}
		case 3:	//查询卡附着
		{
			recount++;
			if(1 == Proto_M4G_Cmd("AT+CSQ\r\n", "OK\r\n", 200))
			{
				//获取信号
				if(drv_usart_write(M4G_COM, (uint8_t*)"AT+CSQ\r\n", strlen("AT+CSQ\r\n"), 10))
				{
					uint8_t buf[100], length=0;
					memset(buf,0,sizeof(buf));
					length = drv_usart_read(M4G_COM, buf, 100, 200);		
					if((length)&&(length<100))
					{
						char *colon_pos = strstr((char*)buf, ":"); // 找到冒号位置
						char *value_str = colon_pos + 1; // 跳过冒号
						char *endptr;
						long value = strtol(value_str, &endptr, 10); // 转换为数值
						if (endptr != value_str) { // 确保转换成功
							//printf("提取的数值: %ld\n", value);
							m4g_CSQ = value;
						}
					}
				}
				recount   = 0;
				init_step = 4;
			}
			else
			{
				m4g_CSQ = 0;
			}
			break;
		}
		case 4:	//查询卡信号
		{
			recount++;
			if(1 == Proto_M4G_Cmd("AT+CGATT?\r\n", "OK\r\n", 200))
			{
				recount   = 0;
				init_step = 5;
			}
			break;
		}	
		case 5:	//启动TCP连接透传模式
		{
			recount++;
			sprintf(cmd, "AT+QIOPEN=1,0,\"TCP\",\"%s\",%d,0,2\r\n", pServer, pPort);
			if(1 == Proto_M4G_Cmd(cmd, "CONNECT\r\n", 200))
			{
				recount   = 0;
				init_step = 0;
				return 1;
			}
			break;
		}
		default:break;
	}
	return 0;
}

进入连接

初始化连接上服务器后,进入连接状态,就可以进行数据收发了。一般使用心跳帧来判断连接是否保持,如果判断断开后则返回到未登录状态,再次进行初始化配置连接。下面的示例中就没有实现心跳,后续根据具体通信协议完善。

bash 复制代码
void M4G_Com_Thread(void const * argument)
{
	static uint32_t heartbeatMs = 0;
	uint8_t rdvLen = 0;
	uint8_t rcvBuf[128];
	
	for( ; ; )
	{
		switch(LoginStatus)
		{
			case 0:	//掉线后尝试重新连接,并读取信号强度
			{
				if(1==Proto_M4G_init((uint8_t *)"36.137.226.30", 34064))
				{
					LoginStatus = 1;
				}
				osDelay(1000);	/* AT指令之间时间定位1s, 后续再优化重连时间 */
				break;
			}
			case 1:
			{
				if(Tick_Out(&heartbeatMs, 10000))	//10s周期发送数据 - 后续再完善心跳超时 重连机制
				{
					Tick_Out(&heartbeatMs, TICK_OUT_RESTART);
					Proto_m4g_send((uint8_t*) "TEST MSG FROM DC7000", strlen("TEST MSG FROM DC7000"), 100);
				}
				memset(rcvBuf, 0, sizeof(rcvBuf));
				rdvLen = Proto_m4g_recv(rcvBuf, 100, 100);
				if(rdvLen>0)
				{
					Proto_m4g_send((uint8_t*) rcvBuf, rdvLen, 100);
				}
				break;
			}
			default:break;
		}
		osDelay(50);
	}
}

通信测试

本案例视同安可信透传云来做测试。具体步骤如下:

连接前

连接后

数据交互

设备周期上传数据

设备端代码
服务器端

服务器下发数据,设备端收到后原帧返回

设备端代码
设备端接收数据缓存
服务器端

总结

本篇博文记录了移远4G模块的初始化和连接通信测试。更多详细的参数设置和AT指令可以查看移远模块的详细资料。

相关推荐
!停1 小时前
深入理解指针(1)
c语言
sinat_602035361 小时前
翁恺 9取地址运算
c语言
古城小栈1 小时前
Go 72变之 编成 C语言
c语言·python·golang
三佛科技-134163842122 小时前
SM7015 输出12V/18V 电流150MA非隔离LED电源驱动IC典型应用电路
单片机·嵌入式硬件·智能家居·pcb工艺
Darken032 小时前
基于单片机STM32的---断点调试操作
stm32·单片机·嵌入式硬件·断点调试
番茄灭世神2 小时前
升级新版arm-none-eabi-gcc的方法
linux·运维·arm开发
d111111111d2 小时前
在STM32F103C8T6中什么是读写寄存器模型,有什么用,可以干什么,详细解释。
笔记·stm32·单片机·嵌入式硬件·学习
hefaxiang2 小时前
分支和循环(中)
c语言·开发语言
Darken032 小时前
EXTI和NVIC的这两个外设时钟为什么不需要开启?不开启外设时钟程序能否执行?
stm32·单片机·exti·nvic
猫猫的小茶馆3 小时前
【ARM】ARM体系结构与开发基础
arm开发·stm32·单片机·嵌入式硬件·mcu·物联网