2013-04-30 367 views
3

我想要2個Arduinos Leonardo進行通信,例如發送一個字符串,所以我必須使用Serial1通過引腳0(RX)和1(TX)上的RS232進行通信。如何在Arduino上傳輸字符串?

我需要在該引腳中寫入二進制數據,問題是如何使用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&)'

回答

2

您使用String對象(接線/ 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()爲我們的緩衝區分配內存,並在完成後使用免費()....

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: 

} 

我們在串行監視器看到的輸出是:使用toCharArray 這是一些新的文字 釋放內存 沒有泄漏!

+0

我tryed在示波器看'Serial1.print',似乎是發出正確的數據 – mafap 2013-05-01 15:37:41

-2

使用toCharArry(),write()方法使用字符*,不串,這裏就是我的意思是:

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);       // 
    } 
} 
+0

不,toCharArray()不爲C字符串分配任何內存。你需要自己做,否則你最終會遇到SegFault。 – 2013-04-30 17:34:20