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

时间:2016-03-11 07:16:10

标签: c arduino bluetooth-lowenergy at-command hm-10

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

这是我迄今为止所做的尝试:

#include <SoftwareSerial.h>

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());
  }
}

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

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:-1)

您需要了解AT命令和AT命令行之间的区别。阅读V.250规范中第5章的全部内容是一个完美的起点,因为它将教您几乎所有关于基本AT命令处理的知识。甚至after becoming an expert你会阅读这份文件。

调制解调器在收到完整的命令行之前不会开始处理AT命令,所以你应该修复它。但是,您还需要重新修改逻辑,以便读取和解析从调制解调器发回的响应。这在上面的答案中有描述。

更新:似乎HM-10制造商应该了解AT命令和AT命令行之间的区别,因为 HM-10根本不像调制解调器那样Its documentation

  

AT命令格式:大写AT命令格式。字符串格式,没有任何其他符号。 (例如\ r或\ n)

HM-10的命令处理在很多层面都是错误的。如果制造商想要发明他们自己的文本协议来与设备通信,那么他们可以自由地这样做。但是,当它不是这样时,他们不应该把它称为AT命令。这就像参加一个舞蹈课,老师声称他或她正在教你萨尔萨舞,但实际上他只是教他们/她自己发明的一些武断的东西,只是看着别人跳萨尔萨舞时的灵感...... / p>

首先,HM-10开发人员要么完全不了解AT命令行是什么,要么他们故意选择忽略它并实现完全不同的东西,同时仍然称它为AT命令。我不知道哪个最差。调制解调器通过命令行接受AT命令,命令行可能包含几个命令,例如: "ATI\r"是发送一个I命令的命令行,而"ATI I I\r"是发送三个I命令的命令行。 HM-10显然只接受一个命令。

其次,使用扩展语法命令名称但使用基本语法命令参数完全混淆了参数的语法。基本语法命令是单个字符,并且紧跟着后面的数值,例如扩展语法命令具有以等号开头的参数,例如ATM1AT+IPR=9600。 HM-10正在使用一些奇怪的扩展/基本混合语法,如AT+BAUD[para1]。 我再次不确定这是由于无知还是漠不关心。

第三,结果代码和信息的顺序被颠倒和混合。正常的AT命令将在打印最终结果代码之前打印信息文本,例如

AT+IPR?
+IPR:9600
OK

HM-10既反转顺序又将它们组合成OK+Set:[para1]之类的东西。我认为最有可能的解释是对调制解调器的实际操作方式漠不关心。

第四,命令的命名似乎只是从&#34; AT +&#34;开始。然后为该命令添加任何名称,而不使用第34章中所述的任何正确的前缀; 5.4.1命令命名规则&#34;和&#34;附录I&#34;在V.250。我想这是由于无知。

第五,与未经请求的结果代码相对应的名称具有与命令结果代码(例如OK+CONNOK+LOSTOK+WORKOK+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,但谁知道 - 似乎你不得不求助于试错才能找到答案。试图解析从此执行的命令的成功将是一场噩梦。这又是非常糟糕的协议设计。

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

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

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

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

也许实际的HM-10硬件很好,我不知道。但是命令协议除了根本不是AT命令之外还有严重的问题。我建议寻找其他选择。