我是一名初学者,正在尝试在 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 代码,从而避免使用额外的串行链路。