带有 HM-10 的 Arduino 并不总是能收到发送的完整消息

带有 HM-10 的 Arduino 并不总是能收到发送的完整消息

我是一名初学者,正在尝试在 iPhone 和 Arduino Uno 之间进行通信。我有一个 HM-10 BLE 模块设备连接到我的 Arduino。我使用它来从我的 iPhone 发送和接收消息。我的 Arduino 运行 SoftwareSerial 示例草图:

#include <SoftwareSerial.h>

SoftwareSerial mySerial(10, 11); // RX, TX

void setup() {
  // Open serial communications and wait for port to open:
  Serial.begin(9600);
  while (!Serial) {
    ; // wait for serial port to connect. Needed for native USB port only
  }


  Serial.println("Goodnight moon!");

  // set the data rate for the SoftwareSerial port
  mySerial.begin(9600);
  mySerial.println("Hello, world?");
}

void loop() { // run over and over
  if (mySerial.available()) {
    Serial.write(mySerial.read());
  }
  if (Serial.available()) {
    mySerial.write(Serial.read());
  }
}

像这样,一切都正常:Arduino 按预期向我的 iPhone 发送消息,当我向 Arduino 发送“ping”时,串行监视器上会打印“ping”。但是,如果我在

void loop(){
 if (mySerial.available()) {
 Serial.write(mySerial.read);
 String message = String(mySerial.readString);
  if (message == "ping") {
  mySerial.write("pong");
  }
 }
} // the other code stays the same

尽管我发送了“ping”,但串行监视器上突然只显示“p”。 if 语句也不会被触发,因此它不会发回“pong”。

我找不到我的代码中的任何缺陷,昨天使用完全相同的代码它甚至可以运行。

感谢您的帮助!

答案1

这确实是一个编程属于 Stackoverflow 的问题,而不是用法属于超级用户的问题。

无论如何,您的问题是您在两个地方使用串行数据,因此他们无法同时获取全部数据,而是会相互窃取。

Serial.write(mySerial.read);
String message = String(mySerial.readString);

第一次调用获取一个字符 - 你的'p',下一次调用获取剩余的任何内容,直到满足其结束条件或超时为止。

可能您应该取出第一行,然后只打印出该readString()方法获得的字符串(如果有)。

但请注意,您的整体方法还有很多不太理想的地方:

  • readString()暂停你并不知道数据是否会到达蓝牙 LE 的另一端收音机链接没有奇怪的数据包间间隙,尤其是使用 serial-over-ble 通过特性推送数据的方式。

  • 软件串行是一种笨拙的构造,基本上 MCU 的 CPU 必须自己解码串行线路状态,因为 Arduino 的 ATmega328 只有一个硬件串行外设,传统上用于编程和调试输出。还有许多其他廉价的嵌入式平台具有多个硬件串行端口,其中一些可通过 Arduino 生态系统进行编程。

  • 请注意,您的 HM-10 本身就是一个经过编程的 MCU,但蓝牙功能只能与单个昂贵的工具链配合使用。Nordic 的竞争部件具有可用的 Arduino 端口,也就是说,您可以在 BLE 芯片上直接运行 Arduino 代码,从而避免使用额外的串行链路。

相关内容