51单片机-4g通信模块

一、 模块使用

说明

  • 基于串口AT指令的开发方式
  • 有两种工作模式,默认是透传模式,通过其他方式进入AT指令模式,后续有说明
  • 注意插卡不要出错,下图红色位置为SIM卡状态灯,亮才是正常

  • 软件和用户手册下载地址https://www.ebyte.com/product-view-news.html?id=1102
1.1 开始使用

工具

  • 串口调试助手,网络调试助手,用户手册(AT指令),均可在以上网址中下载到

1.2 AT指令控制模块修改波特率

在测试之前,将电源、天线、SIM 卡、串口线等硬件连接好。

1. 打开串口连接4G模块,串口出产默认波特率是115200,可以自行根据用户手册修改

2. 进入AT指令模式,在串口助手内发送+++(不要勾选发送新行),必须在发送+++指令 3s 内发送其

他任意 AT 指令,比如AT+CPIN

3. 观察SIM卡灯是否亮起,AT+ICCID获得SIM卡信息,确认SIM卡安装完好返回数据:

+OK=89860116838013413419

检查信号是否正常,通过AT+CSQ指令检查信号值,建议插入信号天线,返回数据:+OK=31

4.修改波特率, AT+UART先查看当前的波特率是多少,AT+UART=9600,NONE,修改当前的波特率,修改完之后,AT+REBT,重启4G模块。

5.错误指令提示

1.3 公网IP的服务器地址

借助花生壳软件

1. 注册花生壳账号

2. 下载花生壳软件

1. 设置一个TCP服务器

1. 内网穿透

测试

1.4 AT指令控制模块联网

在测试之前,将电源、天线、SIM 卡、串口线等硬件连接好。

1. 打开串口连接4G模块,串口出产默认波特率是115200,可以自行根据用户手册修改

2. 进入AT指令模式,在串口助手内发送+++(不要勾选发送新行),必须在发送+++指令 3s 内发送其

他任意 AT 指令,比如AT+CPIN

3. 观察SIM卡灯是否亮起,AT+ICCID获得SIM卡信息,确认SIM卡安装完好返回数据:

+OK=89860116838013413419

检查信号是否正常,通过AT+CSQ指令检查信号值,建议插入信号天线,返回数据:+OK=31

4. AT+SOCK=TCPC,103.46.128.21,52541 连接socket服务器,

103.46.128.21是公网IP地址,通过花生壳获得,26532是端口号,参数之间逗号隔开

5. AT+LINKSTA查看连接状态,如果第四步没有问题,此时串口返回+OK=Connect

使用

重启后,模块自动进入透传模式,直接可以和服务器进行通信

踩坑

1. SIM卡方向装反了

2. 进入AT指令,认真操作哦

3. AT+SOCK=TCPC,103.46.128.21,26532是正确连接socket服务器的方式,官方给的文档有错误引导

有效使用的样子

代码实现

#include "reg52.h"  // 包含头文件reg52.h,定义了51系列单片机的特殊功能寄存器
#include "intrins.h"  // 包含intrins.h头文件,定义了_nop_()等内联汇编函数
#include <string.h>  // 包含string.h头文件,提供字符串操作函数

#define SIZE 12  // 定义常量SIZE为12,表示命令缓冲区的大小
sfr AUXR = 0x8E;  // 定义特殊功能寄存器AUXR的地址为0x8E
sbit D5 = P3^7;  // 定义D5为P3端口的第7位

char cmd[SIZE];  // 定义一个字符数组cmd,用于存储接收到的命令

// 延时1000毫秒函数,@11.0592MHz
void Delay1000ms()
{
	unsigned char i, j, k;  // 定义三个无符号字符变量i, j, k

	_nop_();  // 空操作,延时一个机器周期
	i = 8;  // 初始化变量i为8
	j = 1;  // 初始化变量j为1
	k = 243;  // 初始化变量k为243
	do
	{
		do
		{
			while (--k);  // 内部循环,k递减至0
		} while (--j);  // 中间循环,j递减至0
	} while (--i);  // 外部循环,i递减至0
}

// 延时10毫秒函数,@11.0592MHz
void Delay10ms()
{
	unsigned char i, j;  // 定义两个无符号字符变量i, j

	i = 18;  // 初始化变量i为18
	j = 235;  // 初始化变量j为235
	do
	{
		while (--j);  // 内部循环,j递减至0
	} while (--i);  // 外部循环,i递减至0
}

// 串口初始化函数,9600bps@11.0592MHz
void UartInit(void)
{
	PCON &= 0x7F;  // 设置波特率不倍速传输,清除PCON寄存器的第7位
	SCON = 0x50;  // 配置串口工作模式1,8位数据,可变波特率,REN使能接收
	AUXR &= 0xBF;  // 定时器1时钟为Fosc/12,即12T
	AUXR &= 0xFE;  // 串口1选择定时器1为波特率发生器
	
	TMOD &= 0x0F;  // 清除定时器1模式位
	TMOD |= 0x20;  // 设定定时器1为8位自动重装方式
	
	TL1 = 0xFD;  // 设定定时初值为0xFD
	TH1 = 0xFD;  // 设定定时器重装值为0xFD
	
	ET1 = 0;  // 禁止定时器1中断
	TR1 = 1;  // 启动定时器1
	
	ES = 1;  // 开启串口中断
	EA = 1;  // 开启总中断
}

// 发送一个字节数据函数
void sendByte(char date_msg)
{
	SBUF = date_msg;  // 将数据写入串口缓冲区SBUF
	while(!TI);  // 等待发送完成,TI为发送中断标志位
	TI = 0;  // 清除发送中断标志位
}

// 发送字符串函数
void sendString(char* str)
{ 
	while(*str != '\0'){  // 当字符串未结束时循环
		sendByte(*str);  // 发送当前字符
		str++;  // 指向下一个字符
	}
}

// 主函数
void main()
{
	D5 = 1;  // 默认高电压(熄灭D5)
	UartInit();  // 初始化串口
	while(1){
		Delay1000ms();  // 延时1秒
		// sendString("hellod World\r\n");  // 发送字符串(此行被注释)
	}
}

// 串口中断处理函数
void Uart_Handler() interrupt 4
{
	static int i = 0;  // 定义静态局部变量i,只初始化一次
	char tmp;  // 定义临时变量tmp
	if(RI)  // 如果接收中断标志位RI为真
	{
		RI = 0;  // 清除接收中断标志位
		tmp = SBUF;  // 将接收到的数据存入tmp
		if(tmp ==':'){  // 如果接收到的字符是':'
			i = 0;  // 重置命令缓冲区索引i
		}
		cmd[i++] = tmp;  // 将接收到的字符存入命令缓冲区,并递增索引i
		
		// 如果接收到的命令是":op",点亮D5
		if(cmd[0]==':' && cmd[1]=='o' && cmd[2]=='p'){
			D5 = 0;  // 点亮D5
			i = 0;  // 重置命令缓冲区索引i
			memset(cmd, '\0', SIZE);  // 清空命令缓冲区
		}
		// 如果接收到的命令是":cl",熄灭D5
		if(cmd[0]==':' && cmd[1]=='c' && cmd[2]=='l'){
			D5 = 1;  // 熄灭D5
			i = 0;  // 重置命令缓冲区索引i
			memset(cmd, '\0', SIZE);  // 清空命令缓冲区
		}
		// 如果命令缓冲区已满,重置索引i
		if(i == SIZE) {
			i = 0;  // 重置命令缓冲区索引i
		}
	}
	if(TI) {
		// 处理发送中断(此处为空操作)
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值