serial.println(String) 打印“#”而不是字符串

serial.println(String) prints "#" instead of the string

我只是想使用序列号接收一个字符串并将该字符串发回。所以当我通过串行向 arduino 发送一个字符串时,arduino 应该自动发回这个字符串。

我创建了这段代码:

String test;

void setup(){
  Serial.begin(9600);
  Serial.setTimeout(2);
  test = "null";
}

void loop(){
  if(Serial.available()){
    test = Serial.readString();
  }
  Serial.println(test);
}

我想这并不难理解。但是现在 arduino 将始终打印“#”而不是变量测试。我连接的串行设备是蓝牙模块。 (hc-06)

我做错了什么?

谢谢!

(我也在 arduino 模拟器 123D 电路中 运行 这段代码。它工作得很好)

您需要更改密码。将 println 移动到 if 语句中。

尝试增加超时间隔,2ms 不够,好的值(在 9600)在 10ms 以上。理论上超时应至少为 3.5 个字符长,对于当前速度,这等于 ~0.4 毫秒。但实际上使用了更高的值。

String test;
void setup(){
  Serial.begin(9600);
  Serial.setTimeout(10);// or more
  test = "null";
}
void loop(){
  if(Serial.available()){
    test = Serial.readString();
    Serial.println(test);// moved into if
  }
}

更新:return 个字符返回的另一个简单解决方案如下:

void loop(){
      if(Serial.available()) Serial.write(Serial.read());
}

更新 2:BLE 模块 HM10(克隆,非官方)有类似问题。它在任何数组之前发送大约 15 个虚拟字节。我没有解决它。但是如果奇怪的字节总是相同的,你可以使用 String.remove() 做一个简单的技巧:

if(Serial.available()){
        test = Serial.readString();
        test.remove(0,5);
        // test.remove - add code to remove last character
        Serial.println(test);
 }

也试试另一个终端。