วันจันทร์ที่ 26 กันยายน พ.ศ. 2559

การเขียนโปรแกรมรับค่าตัวเลขจาก Serial Port(Send number to serial Arduino)


หลายคนอาจส่งสัยว่าทำไมต้องเขียนบทความนี้ขึ้น ขณะที่เราก็สามารถใช้งาน function ที่อยู่ใน Aduino ชื่อว่า Serial.parseInt() ใช่ได้เหมือนกันครับ แต่ความเร็วในการใช่งานนั้นถือว่าช้าพอสมควร จากตัวอย่าง code ที่ผมเขียน ใช่เวลาประมาณ 1 วินาที ในการเปรียบเทียบค่า



ซึ่งงานบ้างงานรอเวลาไม่ได้ขนาดนั้นและผมก็ไปหาข้อมูลมาว่าทำไมถึงช้า ตามที่ผมจับใจความได้เขาบอกว่า function parseInt() นั้นจะมองหา ข้อมูลใน Serial buffer  และอ่านทีละตัวอักษร และ ค้นหาจนกระทั่งไม่เจอ ตัวอักษรใน buffer จะทำการ parse ทำให้เกิดเวลาเพิ่มมากขึ้น


ดังนั้นผมจึงค้นหาวิธีจากการเขียนของคนนี้ มา เขาเขียนโดยทำการอ่านข้อมูลจาก Serial buffer จนกระทั่งเจอตัวอักษร ที่เขากำหนดไว้ และนำเอาไปเปรียบเทียบเป็น ตัวเลขโดยโค็ดที่ผมตัดมาเป็นตัว นี้ครับ

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
int number;
long timer;
long timerBegin;
long timerEnd;

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
}
char inputString[5] ; // เก็บตัวแปร char
void loop() {
  // put your main code here, to run repeatedly:
  if (Serial.available() > 0)
  {
    timerBegin = millis();
    Serial.readBytesUntil(90,inputString,5); // 90 ในที่นี้คือ z มันค่าการอ่าน byte ออกมา,แล้วทำการนำค่าเอาไปเก็บไว้ใน InputString 
    number = atoi(inputString);//แปลงค่า char เป็น number 
    timerEnd = millis();
    timer = timerEnd-timerBegin;
    Serial.print("number is : ");Serial.print(number);Serial.print(" time is : ");
    Serial.print(timer);Serial.println(" ms"); 
  }


}

โดยหลักการทำงานของมันคือ ให้Serial port อ่านข้อมูลจาก buffer จนกระทั่งเจอตัวอักษรที่เรากำหนดไว้ในที่นี้ผมกำหนดเป็น Z แต่การดึงข้อมูลออกไปใช้งานอาจจะต้องมีการดัดแปลงแก้ไขโค็ดอีกนิดหน่อย ผลลัพที่ออกมา ได้ความเร็วในการทำงานแค่ 5 millisecond ครับ

ไม่มีความคิดเห็น:

แสดงความคิดเห็น