0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

AT指令简介、设计与实现

灵动MM32MCU 来源:灵动MM32MCU 作者:灵动MM32MCU 2022-08-19 10:10 次阅读

1

AT指令简介

AT命令作为主控芯片通信模块的协议接口,通常使用串口作为通信协议的传输,因此在通信模块中硬件接口通常为串口,这样简化了主控设备的代码开发。

AT指令通常由前缀、主体、结束符构成,其中前缀为“AT”,主体由命令、参数以及数据组成;结束符一般为“ ”。

AT指令的发送内容最多为1056个字符的长度(不包括“AT”,但包括最后的空字符即回车符号)

使用AT指令进行设备的连接通信,AT client与AT server必须共同完成。

即:AT server 必须对接收的AT client的命令进行判断并发送响应给到AT client;AT client 等待响应,并对响应的数据进行解析处理。

当然AT server也可主动发送数据给AT client,AT client对接收的数据进行解析处理。一般是需要用户做出相应操作的情况,例如:WiFi的断开连接等。

因此,AT server发送的数据可以分为两种,一种是响应数据,另一种则是主动发送的数据(URC)。

AT指令集是用于实现设备(AT client)与服务器(AT Server)之前的连接与通信的方式。

28831620-1ee3-11ed-ba43-dac502259ad0.png

由上图可以看出,AT Client和AT Server既是发送端也是接收端。

AT server需要接收AT Client的请求,对请求进行响应,解析。将响应和解析结果发送给AT client。

2

设计思路

通过串口助手发送AT指令给目标mcu,目标mcu对接收的数据进行解析和超时判断,并响应解析结果,执行对应的响应。

设计思路如图所示:

289bd390-1ee3-11ed-ba43-dac502259ad0.png

3

具体实现

超时设计

通过滴答定时器进行接收和发送的超时判断。

/*Timeoutjudgment.*/
boolis_timeout(uint32_ttimeout)
{
returntick>timeout;
}

/*SysTickISRentry.*/
voidSysTick_Handler(void)
{
tick+=1;
}

解析器设计

判断接收到正确的AT指令是否超时,若超时则返回超时并发送[AT] TIMEOUT给客户端,清除计数值,同时清空将数据接收缓存区。

将目标mcu接收的数据和发送的AT指令进行比较,若匹配则返回匹配成功并发送“[AT] OK”给客户端,若失败则返回错误”[AT] ERROR“给客户端。

uint32_tat_parse(char*cmdstr,uint32_ttimeout)
{
uint32_tret;
tick=0;
while(!(is_timeout(timeout)))
{
if(REC_STA)/*receiveacompletelinecommand.*/
{
REC_STA=false;
for(uint32_ti=0;i<strlen(cmdstr);i++)
{
tick=0;
if(rec_buff[i]==cmdstr[i])
{
ret=AT_RETURN_OK;
}
else
{
ret=AT_RETURN_ERROR;
}
}
memset(rec_buff,0,sizeof(rec_buff));/*clearreceiverbuffer.*/
returnret;
}
}
tick=0;
ret=AT_RETURN_TIMEOUT;
memset(rec_buff,0,sizeof(rec_buff));/*clearreceiverbuffer.*/
returnret;
}

AT 适配器配置

使用pokt-f0040的默认debug接口,UART1(PB6,和PB7),使用接收中断来接收串口助手发送的数据,具体实现如下:

实例化AT适配器

/*initializetheatadaptter.*/
staticAT_Adapter_Typeat=
{
.write=uart_putchar,
.read=uart_getchar,
.rec_buf=rec_buff,
.buf_idx=0u
};

AT接口初始化 void app_at_port_init(void)

初始化UART需要配置:时钟频率、波特率、数据长度、停止位、传输模式及是否使用校验。

voidapp_at_port_init(void)
{
UART_Init_Typeuart_init;

/*Setupthexferengine.*/
uart_init.ClockFreqHz=BOARD_AT_UART_FREQ;/*48mhz,APB2.*/
uart_init.BaudRate=BOARD_AT_UART_BAUDRATE;
uart_init.WordLength=UART_WordLength_8b;
uart_init.StopBits=UART_StopBits_1;
uart_init.Parity=UART_Parity_None;
uart_init.XferMode=UART_XferMode_RxTx;
uart_init.HwFlowControl=UART_HwFlowControl_None;
UART_Init(BOARD_AT_UART_PORT,&uart_init);

/*EnableRXinterrupt.*/
UART_EnableInterrupts(BOARD_AT_UART_PORT,UART_INT_RX_DONE,true);
NVIC_EnableIRQ(BOARD_AT_UART_IRQn);

/*EnableUART.*/
UART_Enable(BOARD_AT_UART_PORT,true);

/*EnableUART.*/
UART_Enable(BOARD_AT_UART_PORT,true);
}

发送函数 uart_putchar(uint8_t c)

/*sneddata.*/
voiduart_putchar(uint8_tc)
{
while(0u==(UART_STATUS_TX_EMPTY&UART_GetStatus(BOARD_AT_UART_PORT)))/*Waitingtxbufferempty.*/
{}
UART_PutData(BOARD_AT_UART_PORT,c);
}

接收函数 uint8_t uart_getchar(void)

uint8_tuart_getchar(void)
{
while(0u==(UART_STATUS_RX_DONE&UART_GetStatus(BOARD_AT_UART_PORT)))/*Waitingrxbufferreceivesacompletebyteofdata.*/
{}
returnUART_GetStatus(BOARD_AT_UART_PORT);
}

发送字符串函数 void uart_putbuffer(uint8_t *str)

/*sendstring.*/
voiduart_putbuffer(uint8_t*str)
{
while((*str)!='�')
{
uart_putchar(*str);
str++;
}
}

中断处理函数

在中断中进行接收数据的处理,判断是否接收到完整的一行命令.当接收到回车换行符时,即表示接收到了一行完整的命令。

/*receiverhandler*/
voidapp_at_port_rx_isr_hook(void)
{
tick=0;
if((0u!=(UART_INT_RX_DONE&UART_GetEnabledInterrupts(BOARD_AT_UART_PORT)))
&&(0u!=(UART_INT_RX_DONE&UART_GetInterruptStatus(BOARD_AT_UART_PORT))))
{
rec_buff[at.buf_idx]=UART_GetData(BOARD_AT_UART_PORT);/*readdatatoclearrxinterruptbits.*/
uart_putchar(rec_buff[at.buf_idx]);
if((rec_buff[at.buf_idx]=='
')&&(rec_buff[at.buf_idx-1]=='
'))/*recievedone.*/
{
REC_STA=true;
at.buf_idx=0;
}
at.buf_idx=(at.buf_idx+1)%AT_CMD_LEN;
}
}
/*BOARD_AT_UART_IRQHandlerISRentry.*/
voidBOARD_AT_UART_IRQHandler(void)
{
app_at_port_rx_isr_hook();
}

main() 函数

main()函数结合上述操作,不断执行用户自定义的任务task()

intmain(void)
{
BOARD_Init();

while(1)
{
task();
}
}

用户自定义的任务 task()

用户设定接收完整的一行AT指令的时间,调用AT指令解析函数,根据响应结果执行自定义任务。

当接收的命令和发送命令匹配时,串口助手显示[AT]READY。

当匹配失败时,串口助手显示[AT]ERROR,小灯长亮。

当指定时间内(本实验设置为5s)没有接收到完整的一行指令时,串口助手显示[AT]TIMEOUT,小灯以1s间隔闪烁。

voidtask(void)
{
while(AT_Parse(&at,cmdlib[0],5000))
{}
AT_SendBuf(&at,"
[AT]READY
");
while(AT_Parse(&at,cmdlib[1],5000))
{}
GPIO_WriteBit(BOARD_LED0_GPIO_PORT,BOARD_LED0_GPIO_PIN,0u);
}

代码中的“cmdlib”为用户自定义的AT指令库,本此实验中定义的AT指令库为:

/*customATcommandset.*/
char*cmdlib[command_len]={"AT+RST","AT+LED=1"};

task任务解读:

当通过串口发送“AT+RST ”时,mcu响应指令,并反馈响应结果给串口助手,若接收正确指令则执行预设任务,发送[AT] READY给串口助手。

当通过串口发送“AT+LED=1 ”时,mcu响应指令,并反馈响应结果给串口助手,若接收正确指令则执行预设任务,点亮小灯。

4

实验结果

5

测试环境

//

KEIL 5.37为程序下载调试环境

• Tera Term作为串口数据的发送和显示的客户端

• 测试板为POKT-F0040

审核编辑:汤梓红


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 串口
    +关注

    关注

    14

    文章

    1483

    浏览量

    74514
  • AT指令
    +关注

    关注

    1

    文章

    41

    浏览量

    11993
  • MM32
    +关注

    关注

    1

    文章

    105

    浏览量

    573

原文标题:灵动微课堂 (第227讲) | 基于F0040串口实现AT指令解析

文章出处:【微信号:MindMotion-MMCU,微信公众号:灵动MM32MCU】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    NOP指令实现过程

    NOP(No Operation)意为无操作,是汇编语言的一个指令。NOP指令既空指令。NOP指令通常作为伪指令。但是,如果在ARMv6K、
    的头像 发表于 09-28 15:47 7438次阅读
    NOP<b class='flag-5'>指令</b><b class='flag-5'>实现</b>过程

    RISC-V架构简介

    【摘要】 本文首先对RISC-V的架构做了简要的介绍,在此基础上实现了LiteOS在RISC-V架构上的适配过程的具体步骤,希望对你有所帮助。1 RISC-V架构简介RISC-V是一个基于精简指令
    发表于 07-28 07:46

    时间戳的简介实现

    时间戳时间戳简介时间戳的实现时间戳的初始化时间戳简介简而言之,就是在代码中插下标注,在代码运行后通过算开始节点TimeStart和结束节点TimeEnd之间的间隔就可以得出代码运行的时间。时间戳
    发表于 02-28 06:23

    单片机指令系统

    单片机指令系统 3.1 MCS-51指令简介 3.2 指令系统 3.1  MCS-51指令
    发表于 06-16 22:51 35次下载

    嵌入式CPU指令Cache的设计与实现

    针对嵌入式CPU 指令处理速度与存储器指令存取速度不匹配问题,本文基于FPGA 设计并实现了可以有效解决这一问题的指令Cache。根据嵌入式五级流水线CPU 特性,所设计
    发表于 08-05 14:27 36次下载

    欧盟环保指令简介

    欧盟《报废电子电器设备指令》(WEEE)和《关于在电子电气设 备中限制使用某些有害物质指令》(ROHS)环保两指令的实施时间日益 迫近,家电制造商为了从源头避免有害物质,纷纷
    发表于 08-12 13:16 24次下载

    DSP常用汇编语言指令简介

    一、指令系统简介TMS320C24x系列DSP伪指令极为丰富,安装指令可以分为六大类:1. Accumulator(累加器指令), arit
    发表于 03-03 22:37 137次下载

    DSP指令系统

    DSP指令系统 指令系统简介TMS320C24x系列DSP伪指令极为丰富,安装指令可以分为六大类:1. Accumulator(累加器
    发表于 03-30 15:52 19次下载

    MCS-51指令简介

    MCS-51指令简介     MCS-51系列单片机指令系统分类     计算机的许多功能都是由程序实现,而程
    发表于 03-11 09:44 1518次阅读

    Thumb指令集之Thumb指令应用

    11.9 Thumb指令应用 11.9.1 Thumb的实现 对3级流水线的ARM处理器来说,做相对较小的改动就可以实现Thumb指令集(5级流水线的
    发表于 10-19 09:34 0次下载
    Thumb<b class='flag-5'>指令</b>集之Thumb<b class='flag-5'>指令</b>应用

    单片机的指令周期的简介和内核架构详细说明

    本文档的主要内容详细介绍的是单片机的指令周期的简介和内核架构详细说明包括了:机器周期、状态周期、时钟周期
    发表于 09-19 17:19 5次下载
    单片机的<b class='flag-5'>指令</b>周期的<b class='flag-5'>简介</b>和内核架构详细说明

    51单片机指令系统的详细资料简介

    MCS-51单片机指令系统(一) 指令系统简介1. 指令分类统计指令总数:111条 操作码:255个 助记符:48个
    的头像 发表于 12-06 17:08 4490次阅读

    基于FPGA的ROM的实现简介

    基于FPGA的ROM的实现简介(嵌入式开发工程师培训学校)-该文档为基于FPGA的ROM的实现简介资料,讲解的还不错,感兴趣的可以下载看看…………………………
    发表于 07-30 09:08 5次下载
    基于FPGA的ROM的<b class='flag-5'>实现</b><b class='flag-5'>简介</b>

    ESP8266官方AT指令实现方法

    官方的AT固件是不开源的,指令解析和功能实现被封装成静态库了,这套AT指令可以很方便的控制芯片,满足一些基本的功能需求,比如AT+MQTT,AT+WEB服务器等,今天记录一下如何实现
    的头像 发表于 05-17 16:13 649次阅读

    汇编指令是什么 计算机语言汇编指令简介

    汇编指令简介 汇编语言是计算机语言的一种,是一种低级语言。相比高级语言,汇编语言更接近底层硬件,使用更加直接,效率更高。但相对而言,汇编语言更加复杂,语法更加严格。 操作数指示符: 大多数指令
    的头像 发表于 12-13 11:18 461次阅读
    汇编<b class='flag-5'>指令</b>是什么 计算机语言汇编<b class='flag-5'>指令</b><b class='flag-5'>简介</b>