安信可A6模块短信模式的配置

安信可A6模块短信模式的配置

前段时间搞了下这个,配置的时候碰到很多问题。
最后上电初始化时是这样配置的

AT                          //第一条为无效指令,A6模块根据这次数据传输调整波特率
AT+GMGD=1,4                 //删除存储的所有短信
AT+CSMS=0,1,1,1             //选择短消息服务
AT+CNMI=2,2,0,1,1           //配置短信接收模式
AT+CMGF=1                   //设置短信格式为text
AT+CSCS="GSM"               //设置短信编码用GSM
AT+CPMS="SM","SM","SM"      //选择短消息内存为SM卡

附上模块程序(STM32F103C8T6)

//gprs_ga6.h
#ifndef __GPRS_GA6_H__
#define __GPRS_GA6_H__

#include "usart.h"

#define GPRS_GA6_TRUE   1
#define GPRS_GA6_FALSE  0
#define GPRS_GA6_NULL   0

extern void GPRS_GA6_Init(void);
//extern void GPRS_GA6_Recive_Unit(void);
//extern int GPRS_GA6_SMSMODE_Loop_Init(u16 time);
extern u8 GPRS_GA6_InitComplete_Flag;

#endif
//gprs_ga6.c
#include "gprs_ga6.h"
//A6模块初始化完成标志
u8 GPRS_GA6_InitComplete_Flag = GPRS_GA6_FALSE;

//送一个字节
u8 GPRS_GA6_Send_Byte(u8 data) {
    USART1_SendData(data);
    return GPRS_GA6_TRUE;
}

//送一组字节 '\0'结尾
u8 GPRS_GA6_Send(u8* data) {
    USART1_SendString(data);
    return GPRS_GA6_TRUE;
}

//A6接收检查子程序 比较两个byte数组
//recive-接收内容 check-比对内容
u8 GPRS_GA6_Recive_Check(u8* recive, u8* check) {
    int i=0;
    int check_len = 0;
    int cmp_pos = 0;

    for (check_len = 0; check_len < USART1_REV_BUFFER_LEN; check_len ++) {
        if (check[check_len] == '\0') {
            break;
        }
    }

    if (check_len <= 1) {
        return GPRS_GA6_TRUE;
    }

    for (i=0; i < USART1_REV_BUFFER_LEN; i++) {
        if (recive[i] == '\0') {
            break;
        }
        if (recive[i] == check[cmp_pos]) {
            cmp_pos += 1;
            if (cmp_pos >= check_len) {
                return GPRS_GA6_TRUE;
            }
        } else {
            cmp_pos = 0;
        }
    }

    if (cmp_pos >= check_len) {
        return GPRS_GA6_TRUE;
    } else {
        return GPRS_GA6_FALSE;
    }
}

//A6接收子程序 check-检查比对内容
u8 GPRS_GA6_Recive(u8* check) {
    u8* recive_buf;
    if (USART1_RevBuffer_Check()) {
        recive_buf = USART1_RevBuffer_Pop();
        if (GPRS_GA6_Recive_Check(recive_buf, check) == GPRS_GA6_TRUE) {
            return GPRS_GA6_TRUE;
        } else {
            return GPRS_GA6_FALSE;
        }
    } else {
        return GPRS_GA6_NULL;
    }
}

//A6发送一个命令 并检查返回
u8 GPRS_GA6_AT_Cmd(u8* cmd, u8* check) {
    static int prc = 0;
    switch (prc) {
        case 0:
            if (GPRS_GA6_Send(cmd) == GPRS_GA6_TRUE) {
                prc = 1;
            }
            break;
        case 1:
            if (GPRS_GA6_Recive(check) == GPRS_GA6_TRUE) {
                prc = 2;
            }
            break;
        case 2:
            prc = 0;
            return GPRS_GA6_TRUE;
        default:
            prc = 0;
            break;
    }
    return GPRS_GA6_FALSE;
}

//A6短信模式初始化
u8 GPRS_GA6_SMSMODE_Init(void) {
    static int prc = -1;
    static u16 time = 0;
    while (1) {
        switch (prc) {
            case -1:
                if (GPRS_GA6_AT_Cmd("AT\r\n", "")) {
                    time = 0;
                    prc = 0;
                    Delay_Nms(1000);
                }               
                break;
            case 0:
                if (GPRS_GA6_AT_Cmd("AT+CMGD=1,4\r\n", "OK")) {
                    prc = 1;
                    time = 0;
                    Delay_Nms(100);
                }
                break;
            case 1: 
                if (GPRS_GA6_AT_Cmd("AT+CSMS=0,1,1,1\r\n", "OK")) {
                    prc ++;
                    time = 0;
                    Delay_Nms(100);
                }
                break;
            case 2:         
                if (GPRS_GA6_AT_Cmd("AT+CNMI=2,2,0,1,1\r\n", "OK")) {
                    prc ++;
                    time = 0;
                    Delay_Nms(100);
                }        
                break;
            case 3:
                if (GPRS_GA6_AT_Cmd("AT+CMGF=1\r\n", "OK")) {
                    prc ++;
                    time = 0;
                    Delay_Nms(100);
                }
                break;
            case 4:
                if (GPRS_GA6_AT_Cmd("AT+CSCS=\"GSM\"\r\n", "OK")) {
                    prc ++;
                    time = 0;
                    Delay_Nms(100);
                }
                break;
            case 5:
                if (GPRS_GA6_AT_Cmd("AT+CPMS=\"SM\",\"SM\",\"SM\"\r\n", "OK")) {
                    prc ++;
                    time = 0;
                    GPRS_GA6_InitComplete_Flag = GPRS_GA6_TRUE;
                    Delay_Nms(100);
                }
                break;
            default:
                prc = -1;
                return GPRS_GA6_TRUE;
        }
        if ((time++) >= 60000) {
            time = 0;
            prc = -1;
            return GPRS_GA6_FALSE;
        }
    }
}

//A6短信模式循环初始化
u8 GPRS_GA6_SMSMODE_Loop_Init(u16 time) {
    u16 i=0;
    for (i=0; i<time; i++) {
        if (GPRS_GA6_SMS_Init() == GPRS_GA6_TRUE) {
            return GPRS_GA6_TRUE;
        }
        Delay_Nms(200);
    }
    return GPRS_GA6_FALSE;
}

//A6初始化子程序
void GPRS_GA6_Init(void) {
    USART1_Init(115200);
    Delay_Nms(500);
    GPRS_GA6_SMSMODE_Loop_Init(10);
}

虽然现在能成功接收短信了,但如果之后新的模块的SDK发生变化那发送的指令可能也会发生变化。

阅读更多
想对作者说点什么? 我来说一句

安信A6文档

2017年10月19日 2.38MB 下载

A20(8266与A6C拍照)

2016年08月31日 2.44MB 下载

没有更多推荐了,返回首页

不良信息举报

安信可A6模块短信模式的配置

最多只允许输入30个字

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭