一、 模块使用
说明
- 基于串口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) {
// 处理发送中断(此处为空操作)
}
}