2

我想要 2 个 Arduinos Leonardo 进行通信,例如发送一个字符串,所以我必须Serial1通过引脚 0(RX)和 1(TX)上的 RS232 进行通信。

我需要在该引脚中写入二进制数据,问题是如何使用Serial1.write. Serial1.print工作没有错误,但我认为它没有做我想要的。有什么建议吗?

void setup() {
  Serial.begin(9600);
  Serial1.begin(9600);
  while (!Serial);  // while not open, do nothing. Needed for Leonardo only
} 

void loop() {
  String outMessage = "";  // String to hold input

  while (Serial.available() > 0) {  // check if at least one char is available
    char inChar = Serial.read();
    outMessage.concat(inChar);  // add Chars to outMessage (concatenate)
  }

  if (outMessage != "") {
    Serial.println("Sent:  " + outMessage); // see in Serial Monitor
    Serial1.write(outMessage); // Send to the other Arduino
  }
}

这条线Serial1.write(outMessage);给了我错误

" no matching function for call to 'HardwareSerial::write(String&)'"

4

2 回答 2

2

您正在使用字符串对象(接线/C++)。该函数使用 C 字符串:Serial.write(char*)。要将其转换为 C 字符串,请使用 toCharArray() 方法。

char* cString = (char*) malloc(sizeof(char)*(outMessage.length() + 1);
outMessage.stoCharArray(cString, outMessage.length() + 1);
Serial1.write(cString);

如果我们不使用 malloc 为 C 字符串分配内存,就会出错。以下代码将崩溃。

void setup() {
  Serial.begin(9600);

  String myString = "This is some new text";
  char* buf;

  Serial.println("Using toCharArray");
  myString.toCharArray(buf, myString.length()+1); // **CRASH** buf is not allocated!

  Serial.println(buf);
}

void loop() {
  // put your main code here, to run repeatedly: 

}

在串行监视器中,我们将得到的唯一消息是:使用 toCharArray。此时执行停止。现在,如果我们纠正问题并使用 malloc() 为我们的缓冲区分配内存,并在完成后使用 free() ......

void setup() {
  Serial.begin(9600);

  String myString = "This is some new text";
  char* buf = (char*) malloc(sizeof(char)*myString.length()+1);

  Serial.println("Using toCharArray");
  myString.toCharArray(buf, myString.length()+1);

  Serial.println(buf);

  Serial.println("Freeing the memory");
  free(buf);
  Serial.println("No leaking!");
}

void loop() {
  // put your main code here, to run repeatedly: 

}

我们在串行监视器中看到的输出是: Using toCharArray 这是一些新文本 释放内存 没有泄漏!

于 2013-04-30T02:09:07.213 回答
-2

使用 toCharArry(),write() 使用 char*,而不是字符串,这就是我的意思:

void setup() {
  Serial.begin(9600);
  Serial1.begin(9600);
  while (!Serial);
} 

void loop() {
  String outMessage = "";

  while (Serial.available() > 0) {
    char inChar = Serial.read();
    outMessage.concat(inChar);
  }

  if (outMessage != "") {
    Serial.println("Sent:  " + outMessage);
    char* CharString;                                    //
    outMessage.toCharArray(cString, outMessage.length()) // My Changes Are Here
    Serial1.write(CharString);                           //
  }
}
于 2013-04-30T16:17:31.923 回答