文章目录
- 一、ML307C
- 二、ML307C
-
- [ 1、波特率](# 1、波特率)
- [ 2、注意事项](# 2、注意事项)
- [ 3、模块测试](# 3、模块测试)
- 三、ML307C串口调试
-
- [ 1、TCP](# 1、TCP)
- [ 2、UDP](# 2、UDP)
- [ 3、PING](# 3、PING)
- [ 4、DNS](# 4、DNS)
- 四、实例代码
一、ML307C
中移物联(比邻智联) ML307C是新一代小尺寸国产化Cat.1 无线通信模组,采用翱捷科技ASR1605 芯片平台,专为物联网应用设计,具备高集成度、低功耗和强大扩展性。
采用行业通用LCC+LGA 封装,可前向兼容ML307系列Cat.1模组,部分型号的外设接口。
ML307C可广泛应用于金融支付、定位追踪、电动两轮车、视频监控等领域。
官方资料: http://onemo10086.com/#/product/detail/729
二、ML307C
1、波特率
模组为自适应波特率模式时,无+MATREADY上报,串口需先输入AT命令,返回OK后可执行后续操作。
(多发送几次AT命令)
2、注意事项
每条AT命令执行完毕后,才能执行下一条命令,不能同时发送多条AT命令。
模组开机返回+MATREADY后,间隔至少2s才能执行AT+CFUN=0或AT+CFUN=1,AT+CFUN=[,]命令默认值为1。
3、模块测试
设备上电,无+MATREADY ,输入 AT,可看到返回信息。

三、ML307C串口调试
1、TCP
AT\r\n
AT\r\n
ATE0\r\n
AT+CPIN?\r\n
AT+CEREG?\r\n
//先尝试关闭0号socket,不需要判断返回
AT+MIPCLOSE=0\r\n
//使用0号socket连接TCP服务器, 服务器地址47.92.31.46(也可以填写域名,域名由于内部需要先DNS域名解析,所以需要等待约8S才可以连接), 服务器端口号 10002
AT+MIPOPEN=0,"TCP","112.125.89.8",33927\r\n
//告诉模组我要使用0号socket发送5字节数据
AT+MIPSEND=0,5\r\n
等待模组返回 >
发送要发送的5字节数据: 11111 (也可以填写16进制数)
模块接收数据,假设0号socket接收到16字节
+MIPURC: "rtcp",0,16,1111111111111111
//创建连接的时候还可以指定本地socket端口号
AT+MIPOPEN=0,"TCP","47.92.31.46",10002,5,0,1000\r\n //指定本地端口号为1000
2、UDP
AT\r\n
AT\r\n
ATE0\r\n
AT+CPIN?\r\n
AT+CEREG?\r\n
//先尝试关闭0号socket,不需要判断返回
AT+MIPCLOSE=0\r\n
//使用0号socket连接UDP服务器, 服务器地址47.92.31.46(也可以填写域名), 服务器端口号 10002
AT+MIPOPEN=0,"UDP","47.92.31.46",10002\r\n
//告诉模组我要使用0号socket发送5字节数据
AT+MIPSEND=0,5\r\n
等待模组返回 >
发送要发送的5字节数据: 11111 (也可以填写16进制数)
模块接收数据,假设0号socket接收到16字节
+MIPURC: "rudp",0,16,1111111111111111
3、PING
AT+MPING="www.baidu.com"\r\n
+MPING: 0,"2409:8C54:870:34E:0:FF:B024:1916",16,60,49
[12:19:52.019]收←◆
+MPING: 0,"2409:8C54:870:34E:0:FF:B024:1916",16,60,49
[12:19:52.099]收←◆
+MPING: 0,"2409:8C54:870:34E:0:FF:B024:1916",16,75,49
[12:19:52.180]收←◆
+MPING: 0,"2409:8C54:870:34E:0:FF:B024:1916",16,75,49
+MPING: "statistics",4,0,60,75,67
4、DNS
AT+MDNSGIP="www.baidu.com"\r\n
+MDNSGIP: "www.baidu.com","2409:8C54:870:34E:0:FF:B024:1916","2409:8C54:870:67:0:FF:B0C2:AD75","120.232.145.185","120.232.145.144"
四、实例代码
ML307C,TCP连接,并发送 "EST_ML307C"
c
#include <REGX52.H>
#include <string.h>
sbit LED1 = P2 ^ 0;
sbit LED2 = P2 ^ 1;
sbit LED3 = P2 ^ 2;
sbit LED4 = P2 ^ 3;
sbit LED5 = P2 ^ 4;
sbit LED6 = P2 ^ 5;
sbit LED7 = P2 ^ 6;
sbit LED8 = P2 ^ 7;
unsigned char AT_OK_Flag = 0;
unsigned char InData_OK_Flag = 0;
#define SIZE 12
char buffer[SIZE];
// 串口中断======================================================
void UART_init() // 设置串行通信 本晶振为11.0592MHZ
{
TMOD = 0x20;
TH1 = 0xfd;
TL1 = 0xfd; // 波特率9600
SM0 = 0;
SM1 = 1; // 串口工作方式1 10位异步
REN = 1; // 串口允许接收
TR1 = 1;
EA = 1;
ES = 1; // 串口中断
}
void UART_SendByte(unsigned char Byte) // 字节的发送
{
SBUF = Byte;
while (TI == 0); // 当数据发送完成时,TI会变为一
TI = 0;
}
void UART_INTERRUPT() interrupt 4
{
static int i = 0; // 静态变量,初始化1次
char tmp;
if (RI)
{ // 中断函数中对接收中断的响应
RI = 0; // RI为接受中断数据标志位,接收完数据硬件置1,需要软件置0
tmp = SBUF;
if(tmp == '>' )
{
InData_OK_Flag = 1;
}
if (tmp == '+' || tmp == 'O' || tmp == 'L')
{
i = 0; // 强制W字符为第一位
}
buffer[i++] = tmp; // 数据偏移
}
if (buffer[0] == 'O' && buffer[1] == 'K')
{ // 连接服务器等OK返回值指令的判断
AT_OK_Flag = 1;
memset(buffer, '\0', SIZE);
}
if (buffer[0] == 'L' && buffer[1] == '1')
{ // 指令L1灯亮
LED1 = 0;
memset(buffer, '\0', SIZE);
}
if (buffer[0] == 'L' && buffer[1] == '0')
{ // 指令L0灯灭
LED1 = 1;
memset(buffer, '\0', SIZE);
}
}
// 延时函数======================================================
void Delay10us(unsigned char t) //@11.0592MHz
{
while (t--)
{
unsigned char i;
i = 2;
while (--i)
;
}
}
void Delay(unsigned int xms) //@12.000MHz
{
unsigned char i, j;
while (xms)
{
i = 2;
j = 239;
do
{
while (--j)
;
} while (--i);
xms--;
}
}
// ML307C======================================================
// ML307C发送AT指令
// pbuf:AT指令,字符串格式,如:"AT"
void ML307C_SendCmd(unsigned char *pbuf)
{
while (*pbuf) // 遇到空格跳出循环
{
UART_SendByte(*pbuf);
pbuf++;
}
UART_SendByte('\r'); // 回车
UART_SendByte('\n'); // 换行
}
// ML307C发送数据到APP
// pbuf:数据
void ML307C_SendData(unsigned char *pbuf)
{
while (*pbuf) // 遇到空格跳出循环
{
UART_SendByte(*pbuf);
pbuf++;
}
}
//ML307C模块TCP工作模式初始化
void ML307C_TCPModeInit(void)
{
UART_init();
Delay(1000);
LED1 = 0;
ML307C_SendCmd("AT");
while (!AT_OK_Flag); // OK返回值的标志位
AT_OK_Flag = 0;
LED2 = 0;
Delay(1500);
ML307C_SendCmd("AT");
while (!AT_OK_Flag); // OK返回值的标志位
AT_OK_Flag = 0;
LED3 = 0;
ML307C_SendCmd("ATE0");
while (!AT_OK_Flag); // OK返回值的标志位
AT_OK_Flag = 0;
LED4 = 0;
ML307C_SendCmd("AT+CPIN?");
while (!AT_OK_Flag); // OK返回值的标志位
AT_OK_Flag = 0;
LED5 = 0;
ML307C_SendCmd("AT+CEREG?");
while (!AT_OK_Flag); // OK返回值的标志位
if (AT_OK_Flag)
{
LED8 = 0; // 点亮LED8灯,代表连接服务器初始化成功
}
}
void main()
{
LED1 = 1;
LED2 = 1;
LED3 = 1;
LED4 = 1;
LED5 = 1;
LED6 = 1;
LED7 = 1;
LED8 = 1;
Delay(1000);
ML307C_TCPModeInit();
while (1)
{
Delay(1000);
ML307C_SendCmd("AT+MIPCLOSE=0");
Delay(1000);
ML307C_SendCmd("AT+MIPOPEN=1,\"TCP\",\"112.125.89.8\",34586");
while (!AT_OK_Flag); // OK返回值的标志位
AT_OK_Flag = 0;
ML307C_SendCmd("AT+MIPSEND=1,13");
while (!InData_OK_Flag); // 可以输入字符串
ML307C_SendData("TEST_ML307C\r\n");
InData_OK_Flag = 0;
}
}