C51_ML307C_4G

文章目录

  • 一、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;
	                
	        }
	}
相关推荐
yuan199971 天前
CMS8S5880 电子锁程序(51单片机)
单片机·嵌入式硬件·51单片机
Lucky_ldy1 天前
51单片机的学习终(结合中科协的个人自用笔记)
笔记·学习·51单片机
智者知已应修善业2 天前
【51单片机8个LED,已经使用了D1D2,怎么样在不动D1D2的前提下实现D6~D8的流水灯】2024-1-19
c++·经验分享·笔记·算法·51单片机
点灯小铭2 天前
基于51单片机的LED点阵汉字显示系统设计
数据库·单片机·嵌入式硬件·毕业设计·51单片机·课程设计·期末大作业
清风6666663 天前
基于单片机的罐体压力控制器设计与实现
单片机·嵌入式硬件·毕业设计·51单片机·课程设计·期末大作业
wengqidaifeng3 天前
嵌入式小白第三站:UART、I2C、SPI、ADC 怎么学?从传感器读数到完整小项目
stm32·单片机·嵌入式硬件·51单片机
智者知已应修善业4 天前
【51单片机使用IO组赋值方法实现无源蜂鸣器响时LED12亮不响时34亮】2024-3-7
c++·经验分享·笔记·算法·51单片机
智者知已应修善业4 天前
【51单片机0.1秒计时到21.0时点亮LED】2024-1-5
c++·经验分享·笔记·算法·51单片机
智者知已应修善业5 天前
【51单片机按键控制1分钟正计时倒计时暂停复位】2024-1-2
c++·经验分享·笔记·算法·51单片机