2012-06-25 17 views
10

मुझे कंप्यूटर से सर्वो का प्रबंधन करना है।Arduino पर एक डिलीमीटर के साथ एक स्ट्रिंग मान कैसे पढ़ा जाए?

तो मुझे कंप्यूटर से Arduino में संदेश प्रबंधित करना होगा। मुझे सर्वो और कोने की संख्या प्रबंधित करने की आवश्यकता है। मैं इस तरह कुछ भेजने के बारे में सोच रहा हूं: "1; 130" (पहला सर्वो और कोने 130, डिलीमीटर ";")।

क्या इसे पूरा करने के लिए कोई बेहतर तरीका है?

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); 
} 

यह काम नहीं करता:

यहाँ मेरी इस कोड है। समस्या क्या है?

उत्तर

2

आपको एक पढ़ा बफर बनाने की आवश्यकता है, और गणना करें कि आपके 2 फ़ील्ड (सर्वो #, और कोने) कहां शुरू होते हैं और समाप्त होते हैं। फिर आप उन्हें अपने कोड के बाकी हिस्सों में उपयोग करने के लिए इन्हें पढ़ सकते हैं और अक्षरों को इंटीग्रर्स में परिवर्तित कर सकते हैं। इस तरह कुछ काम करना चाहिए (Arduino पर परीक्षण नहीं किया गया है, लेकिन मानक सी):

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

अपने काम नहीं .. पहले त्रुटि .. शायद arduino नहीं चढ़े, जिस इस समारोह – yital9

+0

Arduino सी/सी ++ पर आधारित है और एवीआर लिबिक के खिलाफ लिंक है। चार * \t itoa (पूर्णांक: – Mangist

+1

आप अपने स्रोत कोड में शामिल करने की ज़रूरत संदर्भ यहाँ समारोह http://www.nongnu.org/avr-libc/user-manual/group__avr__stdlib.html के लिए देखें – Mangist

4

यह एक महान सब मिला है। यह बहुत उपयोगी था और मुझे उम्मीद है कि यह आपके लिए भी होगा।

यह वह तरीका है जो सब को कॉल करता है।

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

यह उप है!

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

यह बहुत अच्छा काम करता है, और सीधे Arduinos के लिए उपयोग किया जा सकता है! – Bort

15
  • आप Arduino पर सीरियल से तार पार्स करने के लिए Serial.readString() और Serial.readStringUntil() का उपयोग कर सकते
  • आपको यहां से भी धारावाहिक
  • पूर्णांक मूल्यों को पढ़ने के लिए Serial.parseInt() का उपयोग कर सकते

कोड उदाहरण

int x; 
String str; 

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

मूल्य Seria पर भेजने के लिए एल "मेरे स्ट्रिंग \ n5" होगा और परिणाम str = "मेरा स्ट्रिंग" और होगा एक्स = 5

1

ऐसा लगता है कि तुम सिर्फ सही करने के लिए

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

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

मैं भी इसी तरह की shomething बनाया जरूरत है .. :

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

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

अन्य उत्तर में से अधिकांश या तो बहुत वर्बोज़ या बहुत साधारण होते हैं, इसलिए मैंने सोचा कि मैं यह कैसे Arduino लाइब्रेरी का उपयोग करके अपने विशिष्ट उदाहरण के साथ किया जा सकता है की एक उदाहरण देना चाहता हूँ:

Serial पोर्ट से अपने डिलीमीटर तक पढ़ने के लिए आप Serial.readStringUntil विधि का उपयोग कर सकते हैं।

और स्ट्रिंग को एक पूर्णांक में बदलने के लिए toInt का उपयोग करें।

तो एक पूर्ण उदाहरण के लिए

:

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! 
    } 
} 

बेशक हम इस थोड़ा आसान बनाने में कर सकते हैं: itoa साथ

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

     // Do something awesome! 
    } 
}