HM-10和Arduino – 发送AT命令,没有从代码结束的行

我需要在Arduino Uno或Nano上使用HM-10。 我无法弄清楚如何发送AT命令并阅读回复。 这些命令来自串行监视器,但不是代码。

这是我到目前为止所尝试的内容:

#include  SoftwareSerial blueToothSerial(0,1); // RX, TX void setup() { // Open serial communications and wait for port to open: Serial.begin(115200); Serial.println("Serial began"); blueToothSerial.begin(9600); delay(2000); } void loop() { Serial.println("looping..."); blueToothSerial.print("AT+DISC?"); delay(5000); if (blueToothSerial.available()) { Serial.println("bluetooth serial available"); Serial.write(blueToothSerial.read()); } } 

但是,我无法阅读任何回复,我觉得命令没有解雇。 如果(blueToothSerial.available())执行不进入内部

确保在串行监视器选项中设置了NOTh NL和CR。

您需要了解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 II\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+CONNOK+LOSTOK+WORKOK+Get:[para1]OK+Get:[para1]使得HM-10的响应不可能一般地解析。 当具有新响应的新命令被添加到HM-10时,这可能会破坏现有软件。 这是非常糟糕的协议设计。

第六,HM-10惊人地似乎没有在命令失败时返回错误指示的概念。 NAME命令有12个字符限制,那么发出AT+NAMEthis_name_is_longer_than_12_characters返回什么? 我不知道,但我会猜测OK+SetName:previousnameOK+SetName:this_name_is ,但谁知道 – 似乎你必须求助于试错才能找到OK+SetName:this_name_is 。 试图解析从此执行的命令的成功将是一场噩梦。 这又是非常糟糕的协议设计。

第七,一些命令(例如AT+RSSI? )在名称中嵌入了问号而不是让问号表示像调制解调器那样的参数读取命令语法。

其他语法缺陷包括允许单个字符作为参数值。 AT命令只有两种类型的参数,数值和字符串,字符串总是以双引号字符开头和结尾。 在这一点上,我不打算试图找到更多的缺陷。

我绝对认为这是一个嵌入式设备,其中实现支持完整调制解调器语法的东西可能太多而且需要更简单的东西。 这很好,但是你不应该声称这是AT命令。

HM-10看起来像是一个糟糕的萨尔萨老师,你应该避免接触并尽可能远离。 也许如果你只和那个class级的其他人一起跳舞,你可以保持无知的快乐,想象你跳萨尔萨舞,但是每当试图与其他人跳舞时你都会失败。

也许实际的HM-10硬件很好,我不知道。 但是,除了根本不是AT命令之外,命令协议还存在严重的问题。 我建议寻找替代品。