资源简介

基于C语言的通用AT指令代码,含有详细的代码、解释及例子,可直接用于各模块的AT指令通信。

资源截图

代码片段和文件信息



/*
 * iot.c
 *
 *  Created on: 2018年11月1日
 *      Author: admin
 */
 
 /*****************************************************************
* 代码解释可查看
 https://blog.csdn.net/hnxyxiaomeng/article/details/84613712
******************************************************************/

#include “at.h“

#include 
#include 
#include 
#include 

char *atAckBuf;
SendMsgFunc_t SendMsgCallback=NULL;
OS_SEM *pRecvAckSem=NULL;
OS_MUTEX *pAckBufMux=NULL;

static void AT_ClearAckBuff(void);
static char* AT_SearchRecvBuf(const char* recv_struint16_t max_resp_time);

//下面是系统时钟节拍,目前是1000Hz
// (CPU_INT32U)OSCfg_TickRate_Hz;
//ms数转化为系统节拍数
#define MS2OSTICK(ms) ((OSCfg_TickRate_Hz/1000)*(ms))

/*****************************************************************
* 功能:注册AT指令运行环境
******************************************************************/
void AT_RegisterHandler(SendMsgFunc_t func char* recv_buf OS_SEM* recv_sem OS_MUTEX* buf_mutex)
{
SendMsgCallback=func;             //串口发送数据的函数
pRecvAckSem = (OS_SEM*)recv_sem;  //串口收到AT指令回令的信号量,可在串口接收空闲后发出
  //对于裸奔的单片机系统,可改为串口接收空闲后将某个标志位置1

pAckBufMux=(OS_MUTEX*)buf_mutex;  //串口接收缓冲区互斥信号量
atAckBuf = (char*)recv_buf;   //串口接收缓冲区
return;
}

/*****************************************************************
* 功能:发送AT指令
* 输入: send_buf:发送的字符串
recv_str:期待回令中包含的子字符串
        p_at_config:AT配置
* 输出:执行结果代码
******************************************************************/
uint8_t AT_SendCmd(const char *send_strconst char *recv_strstcATConfig *p_at_config)
{
uint8_t _ret = 0;
uint8_t _try_times = 0;
uint8_t _reset_times = 0;
char * _p_msg = NULL;

OS_ERR _timeout_err;

if(SendMsgCallback==NULL | pAckBufMux==NULL | atAckBuf==NULL)
{
return _ret = 2;
}

do
{
AT_ClearAckBuff();

SendMsgCallback(send_strstrlen(send_str));

_p_msg = AT_SearchRecvBuf(recv_strp_at_config->resp_time100ms);

if ( _p_msg != NULL )
{
return _ret = 0;
}
else
{
_try_times ++;
if ( _try_times >= p_at_config->max_try_times )
{
_reset_times ++;

if ( _reset_times >= p_at_config->max_reset_times + 1 )
{
return _ret = 1;
}
else
{
// TODO:硬件方式重启模块
}
}
else
{
OSTimeDlyHMSM( 0 0 0 p_at_config->try_delay1ms OS_OPT_TIME_DLY &_timeout_err );
}
}
}while(1);

return _ret;

}
/*****************************************************************
* 功能:发送数组数据
* 输入: send_buf:发送的数组
buf_len:数组长度
recv_str:期待回令中包含的子字符串
        p_at_config:AT配置
* 输出:执行结果代码
******************************************************************/
uint8_t AT_SendData(const char *send_bufconst uint16_t buf_lenconst char *recv_strstcATConfig *p_at_config)
{
uint8_t _ret = 0;
uint8_t _try_times = 0;
uint8_t _reset_times = 0;
char * _p_msg = NULL;

OS_ERR _timeout_err;

if(SendMsgCallback==NULL | pAckBufMux==NULL | atAckBu

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----
     文件        5342  2018-11-29 10:02  基于C的AT指令代码\at.c
     文件        1032  2018-11-29 10:01  基于C的AT指令代码\at.h
     目录           0  2018-11-29 10:02  基于C的AT指令代码\

评论

共有 条评论