1
完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
本帖最后由 小熊派开源社区 于 2020-2-26 09:11 编辑
1. AT客户端框架 在之前的三篇教程中,我们都是直接使用串口助手发送AT指令与模组通信,本篇教程就来探索一下如何使用] 在使用AT指令的时候,直接发送AT指令的一端称为客户端(AT Client),接收AT指令并返回响应的一端称为服务端(AT Server)。 ESP8266、M26、BC35-G这些通信模组都是接收我们发送的AT指令,所以称为AT命令服务端,MCU 需要向模组主动发送AT指令,称为AT客户端,它们之间的通信架构如下: 首先来看上图中的三个数据流:
三条数据流都可以调用HAL库的API直接实现呀,为什么要设计一层AT框架呢? 在直接调用HAL库实现的时候,首先无法保证每次模组向 MCU 发送的数据都能完整的被接收,所以,我们需要设计一层串口驱动以保证数据在任何时候都可以被完整的接收进缓冲区。 其次,在接收数据之后,难点在于对数据的处理,判断AT指令发送的数据是不是正常的返回结果,从返回结果中提取有效信息等等,这些如果每条指令接收之后,都去写代码依次判断,代码量陡增暂且不说,编程的难度也是直接上升,所以,我们需要基于串口驱动,在保证数据被完整接收的前提之上,再根据AT命令通信的特点,设计一层AT框架,专门负责解析数据,提取有效信息。 串口驱动直接使用LiteOS提供的驱动框架实现,由于其特殊性,最底层的驱动框架实现文件放在了工程目录中,调用HAL库提供的API实现: uart_at.c文件中,主要完成了两个功能:
2.1. 串口初始化 串口初始化函数的调用架构如图: 其中默认初始化的是LPUART1,如果将其它串口作为AT指令的串口,修改这两行代码即可: ring_buffer是专门实现的用户存放接收数据的缓冲区,用户只需要调用read和write操作缓冲区即可,其实现文件在iot-link SDK的IoT_LINK_1.0.0iot_linklink_misc路径下: ring_buffer在串口初始化函数中被调用初始化: 缓冲区大小在宏定义中声明: 初始化之后,向LiteOS注册的中断服务函数只需要调用ring_buffer_write向缓冲区不停的写入接收到的数据,即可保证串口数据被完整的接收。 串口驱动框架中,因为已经有了初始化函数,所以只需要实现read函数和write函数即可,实现的函数架构如下: 因为数据全部保存在了ring_buffer中,所以串口驱动的read API实现用缓冲区提供的读取函数实现即可。 实现read和write两个函数之后,调用如下的宏定义,即可将设备和驱动注册到系统中: CONFIG_AT_DEVICENAME由用户指定,不重复即可,在iot_link_config.h文件中,稍后会讲解。AT客户端框架的实现源码在SDK的IoT_LINK_1.0.0iot_linkat文件夹下: AT框架的架构如下: 如图,因为串口设备已经注册到了系统中,所以AT框架的底层发送和接收函数直接调用LiteOS设备驱动框架提供的API实现,除了上述图中的这些,还涉及到大量的使用信号量、互斥锁、字符串比较等函数进行AT指令匹配处理,提取结果的代码,这些不是理解AT框架的重点,所以图中未给出。 在实现了AT框架之后,最终留给用户使用的接口只要三个,即可完成AT指令的交互,非常简洁:
接下来,我们以ESP8266模组入网为例,讲述如何使用AT框架提供的简洁API与模组交互。 AT框架使能及配置 经过上面的讲解,完整的AT框架其实包括设备驱动框架和AT框架实现两部分,所以首先需要在配置文件中使能驱动框架和AT框架。 打开之前新建的HelloWorld工程(如果没有可以参考之前的教程新建一个HelloWorld工程),在.sdkconfig中进行配置,如图: 使能之后,不仅驱动框架的源码和AT框架的源码会被加入工程,还会进行自动初始化。 打开SDK中下的IoT_LINK_1.0.0iot_link目录中的link_main.c文件,其中在link_main函数即可看到: 首先是驱动框架的初始化: 其次是串口硬件和AT框架的初始化: 在自动初始化的时候,可以看到串口通信波特率由宏定义CONFIG_AT_BAUDRATE指定,串口设备注册到系统的名称由宏定义CONFIG_AT_DEVICENAME指定,那么,这两个宏定义在哪里指定呢? 不用的模组波特率不同,设备名称当然也不尽相同,所以这两个设置在工程目录中的OS_CONFIG/iot_link_config.h中,这里我们使用ESP8266模组实验,设置如图: 发送AT指令的API原型及参数说明如下:
然后在文件中编辑以下内容:
对于AT命令返回的结果,如果其中存放有效信息,我们可以在调用at_command时传入一个缓冲区,如下,发送查询模组的ip地址,并从中提取出ip地址: 在连接路由器的代码之后,添加如下代码 /* 获取ip地址 */ 实验结果如图: |
|
|
|
飞凌嵌入式ElfBoard ELF 1板卡-TF卡烧录流程之烧写过程
91 浏览 0 评论
iTOP-3A5000主控板龙芯架构外加机箱就是一台电脑主机
1031 浏览 0 评论
迅为RK3568开发板EMMC镜像导出打包update.img
1080 浏览 0 评论
飞凌嵌入式-ELFBOARD 硬件知识分享-ELF 2电源电路讲解
1506 浏览 0 评论
2213 浏览 0 评论
小黑屋| 手机版| Archiver| 德赢Vwin官网 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-31 00:58 , Processed in 0.549578 second(s), Total 66, Slave 48 queries .
Powered by 德赢Vwin官网 网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
德赢Vwin官网 观察
版权所有 © 湖南华秋数字科技有限公司
德赢Vwin官网 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号