Electoday 2025

ไมโครคอนโทรลเลอร์ => AVR and Arduino => Topic started by: pacozaa on February 08, 2013, 12:21:45 PM

Title: Serial.read กับ string ครับ
Post by: pacozaa on February 08, 2013, 12:21:45 PM
char inData[20]; // Allocate some space for the string
char inChar=-1; // Where to store the character read
byte index = 0; // Index into array; where to store the character

void setup() {
    Serial.begin(9600);
    Serial.write("Power On");
}

char Comp(char* This) {
    while (Serial.available() > 0) // Don't read unless
                                   // there you know there is data
    {
        if(index < 19) // One less than the size of the array
        {
            inChar = Serial.read(); // Read a character
            inData[index] = inChar; // Store it
            index++; // Increment where to write next
            inData[index] = '\0'; // Null terminate the string
        }
    }

    if (strcmp(inData,This)  == 0) {
        for (int i=0;i<19;i++) {
            inData[i]=0;
        }
        index=0;
        return(0);
    }
    else {
        return(1);
    }
}

void loop()
{
    if (Comp("m1 on")==0) {
        Serial.write("Motor 1 -> Online\n");
    }
    if (Comp("m1 off")==0) {
        Serial.write("Motor 1 -> Offline\n");
    }
}


อยากทราบว่าโปรแกรมนี้ทำงานยังไงน่ะครับ
http://stackoverflow.com/questions/5697047/convert-serial-read-into-a-useable-string-using-arduino


ผมไม่เข้าใจอยู่สองจุดครับ

char Comp(char* This) ทำงานยังไงครับ
(strcmp(inData,This)  == 0) ทำงานยังไงครับ
ถ้าเป็นไปได้รบกวนอธิบายโปรแกรมโดยรวมให้หน่อยครับ
Title: Re: Serial.read กับ string ครับ
Post by: tumrobot on February 08, 2013, 04:39:07 PM
สั้นๆ นะครับ ตามความเข้าใจของผม

char Comp(char* This) เป็นฟังก์ชั่นที่รับ ข้อมูลสตริง เข้ามาแล้วนำมาเปรียบข้อมูลที่รับมาจาก Serial
โดยใน Loop main นั้นมีการส่งข้อมูล "m1 on" และ "m1 off" เข้ามาในฟังก์ชั่น

ถ้าหากข้อมูลที่ส่งเข้ามาจาก Serial ตรงกัน ตัวฟังก์ชั่น char Comp(char* This) จะคือค่า 0 ออกมา
และใน main ก็จะ print serial เป็น "Motor 1 -> Online\n" หรือ "Motor 1 -> Offline\n" น่ะครับ

ส่วน (strcmp(inData,This)  == 0) ก็คือ String Compare น่ะครับ ถ้า inData = This ก็จะเท่ากับ 0 ครับ

:)
Title: Re: Serial.read กับ string ครับ
Post by: pacozaa on February 08, 2013, 11:26:54 PM
1.ทำไมต้อง มีเครื่องหมาย * ด้วยอ่ะครับ

2.String object เปลืองหน่วยความจำมากไหมครับ เห็นในเว็บ arduino.cc เขาบอกว่าเปลืองมาก ไม่แน่ใจว่า
พอทำโปรเจคแล้วจะมีปัญหาภายหลังรึเปล่าน่ะครับ พอจะทราบวิธีดูไหมครับว่าหน่วยความจำจะพอหรือเปล่า
Title: Re: Serial.read กับ string ครับ
Post by: firmware.c on February 09, 2013, 06:59:47 PM
ตอบข้อ 1) ให้ครับ เครื่องหมาย * คือ pointer ครับ char * คือ pointer ที่ใช้ชี้ไปยังตัวแปรประเภท character  แนะนำให้หาหนังสือ c programming มาอ่าน

ส่วนข้อสองรอสมาชิกท่านอื่นที่ใช้ arduino platform มาตอบแล้วกันนะครับ
Title: Re: Serial.read กับ string ครับ
Post by: pacozaa on February 09, 2013, 10:02:43 PM
ที่เขาใช้ pointer เพราะอะไรหรอครับ จริงๆเขาใช้ (char This) ก็ ได้ใช่ไหมครับ
เพราะช่วยประหยัดหน่วยความจำหรือเปล่าครับ
Title: Re: Serial.read กับ string ครับ
Post by: tumrobot on February 09, 2013, 11:36:27 PM
ใช้ char This ไม่ได้ครับ
ก่อนอื่นคุณต้องไปทำความเข้าใจก่อน char คืออะไร และ string คืออะไร แตกต่างกันยังไง
แล้วคุณจะเข้าใจเองว่า ทำไมต้องใช้ char* This
Title: Re: Serial.read กับ string ครับ
Post by: pacozaa on February 10, 2013, 12:01:27 AM
ขอบคุณครับ เดี๋ยวไปทำความเข้าใจก่อนคร้าบบ
Title: Re: Serial.read กับ string ครับ
Post by: samira on February 10, 2013, 01:02:24 PM
Quote from: pacozaa on February 08, 2013, 11:26:54 PM
2.String object เปลืองหน่วยความจำมากไหมครับ เห็นในเว็บ arduino.cc เขาบอกว่าเปลืองมาก ไม่แน่ใจว่า
พอทำโปรเจคแล้วจะมีปัญหาภายหลังรึเปล่าน่ะครับ พอจะทราบวิธีดูไหมครับว่าหน่วยความจำจะพอหรือเปล่า

อยากทราบว่า ใช้ arduino ตัวใหน ( ธรรมดา หรือ arduino Mega) ครับ
Title: Re: Serial.read กับ string ครับ
Post by: firmware.c on February 10, 2013, 05:04:52 PM
String คือ array ของ char นั่นเองที่มี null terminate ปิดท้าย เมื่อเป็น array นั่นคือ address มันเรียงต่อกันอยู่แล้ว เวลาเข้าถึงจึงนิยมใช้ตัวแปร pointer ในการชี้ ทำไมใช้ char This ไม่ได้คำตอบคือ char This มันแค่ argument ขนาด byte เดียว