AT COMMAND(转载)

AT(Attention)指令是由 Dennis Hayes 发明的,所以也称为 Hayes command set。AT 指令最初是用来指导 modem 工作的,后面随着技术的发展,低速 modem 已经退出了市场,但 AT 指令却不断发展,并且在今天 AT 指令依旧扮演这非常重要的角色。

虽然在 PC 端、手机上已经没有了 AT 的使用,但其却在嵌入式行业里各类联网模块中发挥着重要的作用,而且不仅仅只应用在蜂窝模块,还应用到了 WiFi、BLE 等模块中。

1. 相关标准

随着技术的发展,目前 AT 指令发展过程中形成两个重要标准:

  • V.250:该标准于 1995 年建立,1998 年重命名为 V.250
  • ETSI GSM 07.07(3GPP TS 27.007):用于控制 GSM modem 的 AT 指令集
    GSM 07.07 是基于 V.250 标准的。是目前最新的 AT 标准。

当下 AT 指令的应用

目前的 AT 指令着重应用在蜂窝模块、WiFi 模块、BLE 模块中,目的是为了简化嵌入式设备联网的复杂度。

AT 标准定义了 AT 命令的格式本身,比如命令以 AT 为前缀开头,以 或者 结尾,这被现有的 AT 模块所延用。

但是,由于每个厂家的模块不一样,实现的功能不一样,导致每个 AT 模块厂家有自己的一套私有的 AT 命令集,每一个 AT 模块厂家实现的 AT 指令集解析器也不一样(解析器实现的 AT 标准功能也参差不齐)。

2. AT 模块的应用框图

既然是指令集,那么必然会有指令集的解析处理,通常,我们把 AT 模块端的解析处理程序称为 AT Server,而将控制 AT 模块的处理器端的解析处理程序称为 AT Client。由 AT Client 发起命令请求,AT Server 回应处理结果。另外 AT Server 通过 URC(Unsolicited result code) 来主动给 AT Client 发送数据。

应用框图如下所示:

3. 一些约定

AT 命令的常用格式:

AT+CMD=<xxx>[,<xxx>,<xxx>]

AT 指令以 AT 开始,以 \r 或者 \r\n 结尾,参数之间使用 , 隔开,字符串参数使用双引号 "" 包裹,整形参数不适用双引号。

  • <CR>:回车符
  • <LF>:换行符
  • <xxx>
    尖括号中的名称 xxx 在 AT 里是一个语法元素,要求必须指定。尖括号本身不会出现在命令行里。
  • [xxx]
    中括号中的名称 xxx 在 AT 里是一个语法元素,表示可选择指定。中括号本身不出现在命令行里。

4. 四类 AT 命令

  • Test 命令:AT+<x>=?
    测试指令类似于命令行里的 help 指令,用于提供该命令的使用信息,以及命令参数的取值范围。
  • Read 命令:AT+<x>?
    用于查询该指令对应功能的当前值。
  • Set 命令:AT+<x>=<...>
    设置用户指定的参数到对应的功能里。
  • Execute 命令:AT+<x>
    执行相关操作。
  • \r\nOK\r\n
    如果 AT 指令被 AT Server 识别,并正确执行,则返回该结果。
    “ 标准中的 V1 模式下响应结果代码的方式。V0 模式下返回 0\r
  • \r\nERROR\r\n
    “ 标准中的 V1 模式下响应结果代码的方式。V0 模式下返回 4\r

5. 数据模式与指令模式

在收到 +++,并且接下来 1s 内未收到其他数据的话,将从数据模式切换到指令模式。

数据模式,可以透传数据,client 发什么,server 就原封不动发出去。指令模式时,AT Server 需要解析 AT 指令,并作出响应。

6. 乐鑫中数据透传发送与退出透传发送

  1. 模块透传发送数据
    首先设置数传模式为透传模式,指令 AT+CIPMODE=1。1:透传模式;0:普通模式。他们的主要区别是在透传模式可以在 AT+CIPSEND 指令后一直发送数据(直到退出透传发送),而普通模式下每次发送数据必须使用 AT+CIPSEND=x 来指定数据长度。
    AT+CIPMODE=1

    OK
    AT+CIPSEND

    OK

    >

    这个时候就可以发送数据直达模块了。
  2. 模块退出透传发送
    发送 +++ 后停顿 1 秒。使用串口工具一次性发送 +++ 而不是手动一个个发送,否则会导致误检测成数据。
    这是 AT 指令的一个标准约定。
    如果此时想切换成 普通数传模式,发送 AT+CIPMODE=0 指令。

7. 少有人关注的 AT 解析器

互联网上很多 xxx AT 指令使用教程,为何少有人关注 AT 解析器呢?

情况是这样的,绝大部分开发者是拿 AT 固件来开发产品的,只有很少一部分人是开发 AT 固件的。AT 固件通常是由芯片原厂、模组厂商来提供的,并且大多模组厂商也仅基于芯片原厂提供的 AT 解析器自定义 AT 指令。所以设计 AT 解析器的人就更少了,由于芯片原厂通常又不会提供 SDK 源码到互联网上,因此也基本上看不到 AT 解析器分析的文章。所以,互联网上关于 AT 的文章大都是某某模块都 AT 指令如何使用、怎么使用 MCU 控制 AT 指令模块。

总结:用 AT 固件都多,开发 AT 固件的少,设计 AT 解析器的人更少。

7.1 AT 指令共性的内容

  1. 遵循 AT 规范,AT 开头,CRLF 结尾(考虑到有些平台只用 LF 的情况,CRLF 结尾还需要容错);
  2. 有五类 AT 指令(TEST, GET, SET, EXEC),这里不带加号算作是 basic 指令;
  3. 字符串类型使用双引号("string")括起来;
  4. 整数类型不实使用双引号;
  5. 特殊字符需要转译;
  6. 等号后面必须有一个参数(当然你的解析器也可以容忍等号后面无参数,作为默认参数填充,这样的话跟执行命令又有什么不同呢);
  7. 支持省略参数。

以上这些都是需要基于 AT 解析器实现。

7.2 AT 指令差异的内容

  1. 参数数量不定
  2. 参数类型不定
  3. 是否有 省略参数
  4. 参数内容不同
  • 是否使用来非 ascii 文本
  • 是否使用来特殊符号
  • 各种可能性的 AT 指令格式错误(人为原因)
  • 是否有需要 转译 的字符,转译规则是怎么样的

由于这些都是跟用户输入紧密相关的,解析器事先并不知道,要想解析这些情况下的文本,我们需要先定好规则,告诉解析器支持什么、不支持什么、特殊特性如何支持等,然后用户按照既定的规则输入正确的指令,同时解析器也应该能检测到错误格式的指令并报告错误。

以上 4 条里,最麻烦的就是第四条——用户可能使用任何可打印文本,另外最复杂的还是处理 待转译的字符

7.3 转译字符语法

乐鑫给出里下面几个需要转译的字符:

  • 反斜杠本身 \,转译用法 \\
  • 逗号 ,,转译用法 \,
  • 双引号 ",转译用法 \"
  • \<any>,意思是使用 \ 后面的所有字符 <any> 替代这里的 \

用 AT+CWSAP=<ssid>,<pwd>,<channel>,<ecn> 指令举例,改指令用于启动一个 AP 热点,举例如下:

AT+CWJAP="ssid_\\\"\,\"\<any>\<\"\,\\\123中文>", "12345678",6,0

上面这条指令会启动一个 AP 热点,ssid 名称将是 ssid_\","<any><",\123中文>,密码是 12345678,信道是 6,加密方式是 open。有硬件条件的用户可以验证下。

7.4 指令和数据混合传输

除了对特殊格式的 AT 指令解析外,还有一个难点,就是使用 AT 串口进行数据传输(后面简称数传)。AT 指令模块串口的另外一端通常连接着一个 MCU,MCU 通过 AT 串口发送数据给 Wi-Fi 模块,Wi-Fi 模块再发送到网络上;Wi-Fi 模块收到数据后,也是通过 AT 串口发送数据到 MCU。通常,还不仅仅存在一路数据传输,还会有多路数据传输(比如两路 TCP),这个时候怎么管控他们使用 AT 串口呢,以及什么时候发送数据,又什么时候发送 AT 指令呢?

在 MCU 通过 AT 串口给 Wi-Fi 模块发送数据的时候,乐鑫有两种数传模式:normal 模式 和 passthrough 透传模式。透传模式只支持单个连接。

  • 在 normal 模式下,MCU 需要先告诉对端 Wi-Fi 模块我要发多少数据,然后再发送数据;
    在 normal 模式下 MCU 使用 AT+CIPSEND=<len> 指令,告诉 Wi-Fi 模块我要发 len 字节数据,请进入 数据传输模式,我这个指令后就发数据了。
  • 在 透传 模式下,每 20ms 或者每 2048 字节发送一次,哪个方式先到用哪个方式。
    在透传模式下 MCU 使用 AT+CIPSEND 执行指令,告诉 Wi-Fi 模块我要发数据了,请进入 数据透传模式,我这个指令后就发数据了。
    AT 标准规定从数据透传模式切换到 AT 指令模式需要单独发送一包 +++ 的数据,并在紧接着的 1s 内不发送任何内容,这样 AT 解析器就会从数据透传模式切换到 AT 指令模式

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/218741.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

多线程中死锁是如何产生的?如何检测?如何避免?

一、死锁是如何产生的&#xff1f; 死锁&#xff1a;是指两个或多个线程在执行过程中&#xff0c;因争夺资源而造成的一种僵局。具体来说&#xff0c;每个线程持有一部分资源&#xff0c;并等待其他线程所持有的资源释放&#xff0c;导致所有线程都无法继续执行。 例如&#…

马斯克“赛博皮卡”Cybertruck交付!43万起售,性能强如猛兽

原创 | 文 BFT机器人 埃隆马斯克常常被称为是“天才与疯子”的结合&#xff0c;一直是一个争议不断的人物。他九十年代创办电子支付公司&#xff1b;2004年成立特斯拉&#xff0c;开创了一个汽车领域的新时代&#xff1b;人到中年又扬言要发射卫星建立全球无线网…… 许多科技…

Python必备神器揭秘:15个最热门库全解析

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com Python生态系统中拥有大量优秀的库&#xff0c;为开发者提供了广泛且强大的工具。本文将介绍15个最受欢迎的Python库&#xff0c;包括它们的功能、优点以及示例代码&#xff0c;帮助读者更全面地了解和使用这些库…

游戏开发常见算法

1.根据权重获取不同的值&#xff1a; 算法思想&#xff1a; 代码实现&#xff1a; _proto.randWeightEnemy function (enemyIdMap, enemyIds, targetWeight, weightArray, monsterNumLimit) {console.log("目标权重值"targetWeight); //targetWeight的值为1700var r…

基于SpringBoot实现的电影院售票系统

一、 系统架构 前端&#xff1a;html | jquery | bootstrap 后端&#xff1a;springboot | thymeleaf | spring-data-jpa 环境&#xff1a;jdk1.8 | mysql | maven 二、代码及数据库 三、功能介绍 01. 首页 02. 登录页 03. 管理端-电影列表 04. 管理端-添加电影 05. 管…

[PyTorch][chapter 4][李宏毅深度学习][Gradient Descent]

前言&#xff1a; 目录: 1: 梯度下降原理 2: 常见问题 3&#xff1a; 梯度更新方案 4&#xff1a; 梯度下降限制 一 梯度下降原理 机器学习的目标找到最优的参数,使得Loss 最小 为什么顺着梯度方向loss 就能下降了。主要原理是泰勒公式。 假设损失函数为 忽略二阶导数, 当 …

【Python】创建简单的Python微服务Demo与FastAPI

创建简单的Python微服务Demo与FastAPI 在微服务架构中&#xff0c;通过FastAPI框架创建一个简单的Python微服务Demo涉及多个步骤&#xff0c;包括定义服务、使用框架、进行通信等。在这篇文章中&#xff0c;我们将使用FastAPI框架创建两个简单的微服务&#xff0c;它们通过RES…

k8s部署单机模式的minio

k8s部署单机模式的minio 一、说明二、yaml内容三、步骤3.1 创建资源3.2 查看启动日志3.2 查看svc并访问控制台 一、说明 项目使用minio&#xff0c;准备在k8s环境部署一套minio试用。 1.关于minio的原理和概念参考: https://mp.weixin.qq.com/s?__bizMzI3MDM5NjgwNg&mid…

zabbix6.4监控交换机发现ICMP报错Ping item must have target or host interface specified

报错信息&#xff1a; 查看监控项&#xff1a; 修改键值&#xff1a; 保存再次检查&#xff0c;发现又报错/usr/sbin/fping: [2] No such file or directory 原因是&#xff0c;zabbix-server上没有安装fping工具 解决方法&#xff1a;yum install fping -y 之后数据采集正常…

Retrofit的转换器

一、前言 1.为什么要使用Retrofit转换器 在我们接受到服务器的响应后&#xff0c;目前无论是OkHttp还是Retrofit都只能接收到String字符串类型的数据&#xff0c;在实际开发中&#xff0c;我们经常需要对字符串进行解析将其转变为一个JavaBean对象&#xff0c;比如服务器响应…

12、pytest上下文友好的输出

官方实例 # content of test_assert2.py import pytestdef test_set_comparison():set1 set("1308")set2 set("8035")assert set1 set2def test_dict_comparison():dict_1 {name:陈畅,sex:男}dict_2 {name:赵宁,sex:女}assert dict_1 dict_2def tes…

神经网络常用归一化和正则化方法解析(一)

&#x1f380;个人主页&#xff1a; https://zhangxiaoshu.blog.csdn.net &#x1f4e2;欢迎大家&#xff1a;关注&#x1f50d;点赞&#x1f44d;评论&#x1f4dd;收藏⭐️&#xff0c;如有错误敬请指正! &#x1f495;未来很长&#xff0c;值得我们全力奔赴更美好的生活&…

代理IP和网络加速器的区别有哪些

随着互联网的普及&#xff0c;越来越多的人开始使用网络加速器来提高网络速度。然而&#xff0c;很多人并不清楚代理IP和网络加速器之间的区别。本文将详细介绍两者的概念及区别。 一、代理IP 代理IP是一种通过代理服务器进行网络连接的方式。在使用流冠代理IP时&#xff0c;用…

伴随高性能多级网关和多级分布式缓存架构应用实战经验

随着互联网业务的快速发展&#xff0c;对于高性能网络架构的需求越来越迫切。在这篇文章中&#xff0c;我们将介绍高性能多级网关和多级分布式缓存架构在实际应用中的经验&#xff0c;并提供相关示例代码。 一、高性能多级网关的设计与实现 高性能多级网关是一个重要的网络架构…

软件外包公司的核心竞争力

软件外包公司的核心竞争力可以涵盖多个方面&#xff0c;这取决于公司的战略、专业领域和市场定位。以下是一些可能构成软件外包公司核心竞争力的因素&#xff0c;希望对大家有所帮助。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;欢迎交流合作。 1…

js中hasOwnProperty() 方法详解

hasOwnProperty 会返回一个布尔值,判断对象中是否存在该属性,不是继承属性,和原型链上的属性,是对象自身的属性,有返回true,没有返回false hasOwnProperty() 方法是 Object 的原型方法&#xff08;也称实例方法&#xff09;&#xff0c;它定义在 Object.prototype 对象之上&am…

动能资讯 | 智慧汽车—城市NOA迎爆发

在特斯拉引领的 TransformerBev 架构驱动下&#xff0c;智驾算法趋近于端到端的智驾大模型&#xff0c;使得智能驾驶开始步入城市 NOA 新时代。 消费者认知增强&#xff0c;未来市场空间广阔。伴随城市 NOA 在 23-24 年的落地和普及、L3 法规在年内的落地&#xff0c;行业 0-1…

众里寻她千百度:使用Excalidraw一句话绘制进销存系统采购入库流程

引言&#xff1a; 本文将介绍如何使用Excalidraw这一在线绘图工具来绘制进销存系统中的采购入库流程&#xff0c;帮助您更好地理解和优化采购流程。 正文&#xff1a; 1. 打开Excalidraw网站&#xff1a; 在浏览器中输入"https://excalidraw.com"&#xff0c;打开Ex…

聚观早报 |真我GT5 Pro细节曝光;iQOO Neo9系列参数曝光

【聚观365】12月5日消息 真我GT5 Pro细节曝光 iQOO Neo9系列参数曝光 抖音商城双12好物节 蔚来正式获得独立造车资质 三星Galaxy S24 Ultra手写笔获认证 真我GT5 Pro细节曝光 今年的顶级旗舰大比拼也进入最后的高潮&#xff0c;剩余还未亮相的骁龙8 Gen3旗舰新机目前也基…

个体诊所电子处方系统哪个好用,推荐一款可以自由设置配方模板能够填写病历可以查询历史病历的门诊处方笺软件

一、前言 1、功能实用&#xff0c;操作简单&#xff0c;不会电脑也会操作&#xff0c;软件免安装&#xff0c;已内置数据库。 2、中医西医均可用此软件开电子处方&#xff0c;支持病历记录查询&#xff0c;药品进出库管理&#xff0c;支持配方模板一键导入电子处方。 二、电子…