2012-06-25 13 views
10

Tôi phải quản lý servo từ máy tính.Làm thế nào để đọc một chuỗi giá trị với một delimeter trên Arduino?

Vì vậy, tôi phải gửi quản lý thư từ máy tính đến Arduino. Tôi cần quản lý số lượng servo và góc. Tôi đang nghĩ đến việc gửi một cái gì đó như thế này: "1; 130" (servo đầu tiên và góc 130, delimeter ";").

Có phương pháp nào tốt hơn để thực hiện việc này không?

Đây là mã này của tôi:

String foo = ""; 
void setup(){ 
    Serial.begin(9600); 
} 

void loop(){ 
    readSignalFromComp(); 
} 

void readSignalFromComp() { 
    if (Serial.available() > 0) 
     foo = ''; 
    while (Serial.available() > 0){ 
    foo += Serial.read(); 
    } 
    if (!foo.equals("")) 
    Serial.print(foo); 
} 

này không hoạt động. Có chuyện gì vậy?

Trả lời

2

Bạn cần xây dựng bộ đệm đọc và tính toán nơi bắt đầu và kết thúc 2 trường (servo # và góc) của bạn. Sau đó, bạn có thể đọc chúng và chuyển đổi các ký tự thành Số nguyên để sử dụng trong phần còn lại của mã. Một cái gì đó như thế này nên làm việc (không được thử nghiệm trên Arduino, nhưng tiêu chuẩn C):

void loop() 
     { 
      int pos = 0; // position in read buffer 
      int servoNumber = 0; // your first field of message 
      int corner = 0; // second field of message 
      int cornerStartPos = 0; // starting offset of corner in string 
      char buffer[32]; 

      // send data only when you receive data: 
      while (Serial.available() > 0) 
      { 
       // read the incoming byte: 
       char inByte = Serial.read(); 

       // add to our read buffer 
       buffer[pos++] = inByte; 

       // check for delimiter 
       if (itoa(inByte) == ';') 
       { 
        cornerStartPos = pos; 
        buffer[pos-1] = 0; 
        servoNumber = atoi(buffer); 

        printf("Servo num: %d", servoNumber); 
       } 
      } 
      else 
      { 
       buffer[pos++] = 0; // delimit 
       corner = atoi((char*)(buffer+cornerStartPos)); 

       printf("Corner: %d", corner); 
      } 
     } 
+0

nó không hoạt động .. lỗi đầu tiên với itoa .. có lẽ Arduino has not chức năng này – yital9

+0

Arduino dựa trên C/C++ và các liên kết chống lại AVR Libc. Xem tham chiếu tại đây cho hàm http://www.nongnu.org/avr-libc/user-manual/group__avr__stdlib.html – Mangist

+1

Bạn cần phải bao gồm trong mã nguồn của mình – Mangist

4

Đây là một tiểu vĩ đại tôi được tìm thấy. Điều này là siêu hữu ích và tôi hy vọng nó sẽ được cho bạn là tốt.

Đây là phương thức gọi phụ.

String xval = getValue(myString, ':', 0); 

Đây là phụ!

String getValue(String data, char separator, int index) 
{ 
    int found = 0; 
    int strIndex[] = { 
    0, -1 }; 
    int maxIndex = data.length()-1; 
    for(int i=0; i<=maxIndex && found<=index; i++){ 
    if(data.charAt(i)==separator || i==maxIndex){ 
     found++; 
     strIndex[0] = strIndex[1]+1; 
     strIndex[1] = (i == maxIndex) ? i+1 : i; 
    } 
    } 
    return found>index ? data.substring(strIndex[0], strIndex[1]) : ""; 
} 
+1

Điều này làm việc tuyệt vời, và có thể được sử dụng trực tiếp như-là cho Arduinos! – Bort

15
  • Bạn có thể sử dụng Serial.readString() và Serial.readStringUntil() để phân tích chuỗi từ nối tiếp trên Arduino
  • Bạn cũng có thể sử dụng Serial.parseInt() để đọc các giá trị số nguyên từ sê-ri

Mã số Ví dụ

int x; 
String str; 

void loop() 
{ 
    if(Serial.available() > 0) 
    { 
     str = Serial.readStringUntil('\n'); 
     x = Serial.parseInt(); 
    } 
} 

giá trị để gửi qua seria l sẽ là "chuỗi của tôi \ n5" và kết quả sẽ là str = "string của tôi" và x = 5

1

Dường như bạn chỉ cần sửa

foo = ''; >>to>> foo = ""; 

    foo += Serial.read(); >>to>> foo += char(Serial.read()); 

Tôi cũng khiến shomething tương tự .. :

void loop(){ 
    while (myExp == "") { 
    myExp = myReadSerialStr(); 
    delay(100); 
    } 
}  

String myReadSerialStr() { 
    String str = ""; 
    while (Serial.available() > 0) { 
    str += char(Serial.read()); 
    } 
    return str; 
} 
3

Hầu hết các câu trả lời khác hoặc là rất dài dòng hoặc rất chung chung, vì vậy tôi nghĩ rằng tôi muốn đưa ra một ví dụ về cách nó có thể được thực hiện với ví dụ cụ thể của bạn bằng cách sử dụng thư viện Arduino:

Bạn có thể sử dụng phương thức Serial.readStringUntil để đọc cho đến khi dấu phân cách của bạn từ cổng Serial.

Và sau đó sử dụng toInt để chuyển đổi chuỗi thành số nguyên.

Vì vậy, cho một ví dụ đầy đủ:

void loop() 
{ 
    if (Serial.available() > 0) 
    { 
     // First read the string until the ';' in your example 
     // "1;130" this would read the "1" as a String 
     String servo_str = Serial.readStringUntil(';'); 

     // But since we want it as an integer we parse it. 
     int servo = servo_str.toInt(); 

     // We now have "130\n" left in the Serial buffer, so we read that. 
     // The end of line character '\n' or '\r\n' is sent over the serial 
     // terminal to signify the end of line, so we can read the 
     // remaining buffer until we find that. 
     String corner_str = Serial.readStringUntil('\n'); 

     // And again parse that as an int. 
     int corner = corner_str.toInt(); 

     // Do something awesome! 
    } 
} 

Dĩ nhiên chúng ta có thể đơn giản hóa này một chút:

void loop() 
{ 
    if (Serial.available() > 0) 
    { 
     int servo = Serial.readStringUntil(';').toInt(); 
     int corner = Serial.readStringUntil('\n').toInt(); 

     // Do something awesome! 
    } 
}