您需要了解 AT 命令和 AT 命令行之间的区别。阅读 V.250 规范中的所有第 5 章是一个完美的起点,因为它将教您几乎所有您需要了解的有关基本 AT 命令处理的知识。即使在成为专家之后,您也会阅读此文档。
调制解调器在收到完整的命令行之前不会开始处理 AT 命令,因此您应该修复它。但是您还需要大量修改逻辑以读取和解析从调制解调器发回的响应。这在上面链接的答案中有所描述。
更新:HM-10 制造商似乎应该了解 AT 命令和 AT 命令行之间的区别,因为HM-10 根本不像调制解调器。它的文件说
AT 命令格式:大写 AT 命令格式。字符串格式,没有任何其他符号。(例如 \r 或 \n)
HM-10 的命令处理在很多层面上都是错误的。如果制造商想发明他们自己的文本协议来与设备通信,他们完全可以自由地这样做。但是,当它不是这样时,他们不应该将其称为 AT 命令。这就像去上一个舞蹈课,老师声称他或她正在教你萨尔萨舞,但实际上只是在教他/她自己发明的任意东西,只是受到观看别人跳萨尔萨舞的启发......
首先,HM-10 开发人员要么完全不了解 AT 命令行是什么,要么他们故意选择忽略这一点并实现完全不同的东西,同时仍将其称为 AT 命令。我不知道哪个是最糟糕的。调制解调器通过可能包含多个命令的命令行来接受 AT 命令,例如"ATI\r"
,一个命令行发送一个I
命令,而"ATI I I\r"
一个命令行发送三个I
命令。HM-10 显然只接受自己的命令。
其次,使用扩展语法命令名称但使用基本语法命令参数完全混淆了参数的语法。基本语法命令是单个字符并且具有紧跟其后的数值,例如ATM1
扩展语法命令具有以等号开头的参数,例如AT+IPR=9600
。HM-10 正在使用一些奇怪的扩展/基本混合语法,例如AT+BAUD[para1]
. 同样,我不确定这是由于无知还是冷漠。
第三,结果代码和信息的顺序颠倒混合。一个普通的 AT 命令将在打印最终结果代码之前打印信息文本,例如
AT+IPR?
+IPR:9600
OK
HM-10 既颠倒了顺序,又将它们组合成一个像OK+Set:[para1]
. 我认为这很可能可以通过对调制解调器实际操作方式的漠不关心来解释。
第四,命令的命名似乎只是以“AT+”开头,然后为命令附加任何名称,而不使用V.250中“5.4.1 命令命名规则”和“附录 I”一章中所写的任何适当前缀. 我想这是由于无知。
第五,对应于未经请求的结果代码的名称具有与命令结果代码完全相同的语法(例如OK+CONN
,OK+LOST
与OK+WORK
, OK+Get:[para1]
),因此无法对来自 HM-10 的响应进行一般解析。而且,当将具有新响应的新命令添加到 HM-10 时,这可能会破坏现有软件。这是非常糟糕的协议设计。
第六,令人惊讶的是,HM-10 似乎没有在命令失败时返回错误指示的概念。NAME 命令有 12 个字符的限制,那么发出AT+NAMEthis_name_is_longer_than_12_characters
返回什么?我不知道,但我会猜测OK+SetName:previousname
或OK+SetName:this_name_is
,但谁知道呢 - 似乎你必须通过反复试验才能找到答案。试图解析由此执行的命令的成功将是一场噩梦。这又是非常糟糕的协议设计。
第七,一些命令(例如AT+RSSI?
)在名称中嵌入了问号,而不是像调制解调器那样让问号指示参数读取命令语法。
其他语法缺陷包括允许单个字符作为参数值。AT 命令只有两种类型的参数,数值和字符串,字符串总是以双引号字符开头和结尾。在这一点上,我不会费心去寻找更多的缺陷。
我绝对明白这是一个嵌入式设备,其中实现支持完整调制解调器语法的东西可能太多了,需要更简单的东西。这很好,但是你不应该声称这是 AT 命令。
HM-10 似乎是你应该避免接触并尽可能远离的糟糕萨尔萨舞老师。也许如果你只和那个班的其他人一起跳舞,你可以想象你在跳萨尔萨舞而保持无知的快乐,但每当你试图和其他人跳舞时,你就会失败。
也许实际的 HM-10 硬件很好,我不知道。但是命令协议除了根本不是AT命令之外还有严重的问题。我建议寻找替代品。