บทความนี้จะเป็นการสื่อสารระหว่างบอร์ด2บอร์ด เพื่อสื่อสารแลกเปลี่ยนข้อมูลกัน

ในตัวอย่างนี้จะใช้เป็นบอร์ด STM32F103C8T6 กับ ESP8266 เพื่อสื่อสารแลกเปลี่ยนข้อมูลกัน

บอร์ด STM จะใช้ Hardware Serial ในการสื่อสารระหว่างบอร์ด

ส่วน ESP จะใช้ Software Serial ในการสื่อสาร

สารบัญ สามารถคลิกเพื่อเลื่อนไปดูหัวข้อที่ต้องการได้เลย

ตัวอย่างรับค่าจาก Serial

เริ่มแรกด้วยตัวอย่าง ReadASCIIString

ลบบางฟังก์ชั่นออกเพราะมีบางพินในตัวอย่างนี้ใช้บนบอร์ด ESP8266 ไม่ได้ จะทำให้บอร์ดทำงานไม่ได้ และเปลี่ยน buadrate เป็น 115200

void setup() {
  // initialize serial:
  Serial.begin(115200);
}

void loop() {
  // if there's any serial available, read it:
  while (Serial.available() > 0) {

    // look for the next valid integer in the incoming serial stream:
    int red = Serial.parseInt();
    // do it again:
    int green = Serial.parseInt();
    // do it again:
    int blue = Serial.parseInt();

    // look for the newline. That's the end of your sentence:
    if (Serial.read() == '\n') {
      // print the three numbers in one string as hexadecimal:
      Serial.print(red, HEX);
      Serial.print(green, HEX);
      Serial.println(blue, HEX);
    }
  }
}

ตัวอย่างนี้จะยกตัวอย่างการรับค่า 3 ค่า โดยเป็นค่า RGB จาก Serial ซึ่งเราจะจำลองส่งข้อมูลผ่าน Serail monitor โดยเลือก Newline (สังเกตุคำสั่ง Serial.read() == ‘\n’ เป็นการบอกว่าจบการสื่อสารด้วย newline) และ buadrate 115200

ทดลองส่งค่า 3 ค่า โดยแยกค่าด้วยเว้นวรรค ยกตัวอย่างส่งค่า 10 20 30 บอร์ดจะตอบกลับเป็นเลขฐาน16 ซึ่งสามารถแปลงโดยใช้เครื่องคิดเลขตามรูป

ในตัวอย่างจะมีคำสั่งที่สำคัญคือ

while (Serial.available() > 0)   
// จะทำงานเมื่อ Serial ได้รับค่ามา
int red = Serial.parseInt();    
// เป็นการดึงค่าจาก Serial แล้วแปลงเป็น int โดยจะแยกค่า int แต่ละค่าด้วยตัวอักษรที่ไม่ใช่ตัวเลข เช่น เว้นวรรค comma(,) ในที่นี่ต้องการรับ 3 ค่าคือ red green blue

ทดลองส่งค่าจากบอร์ด STM ไปยัง ESP

ทำการส่งข้อมูล 3 ค่า คือ สีแดง สีเขียว สีฟ้า(red green blue)จากบอร์ด STM ไปยัง ESP

  • STM ทำการสุ่มค่า 0-255 ทั้งหมด 3 ค่าสำหรับเป็นค่า RGB
  • STM ส่งค่าออกผ่าน Hardware Serial2 พิน RX,TX = PA3,PA2 ใช้ baudrate = 9600
  • STM ส่งค่า 3 ค่า โดยแยกระหว่างค่าด้วยเว้นวรรค และจบการสื่อสารด้วย” \n” หรือขึ้นบรรทัดใหม่
  • ESP รับค่าผ่าน Software Serial กำหนดใช้พิน RX,TX = D4,D3 ใช้ baudrate = 9600
  • ESP ใช้คำสั่ง parseInt() รับค่าตัวเลข

การต่อสาย

  • PA3 > D3
  • PA2 > D4
  • GND > GND

โค้ด STM

void setup() {
  Serial.begin(115200);
  Serial2.begin(9600); // Serial2 on rx,tx = PA3,PA2
}

void loop() {
  int red = random(255);
  int green = random(255);
  int blue = random(255);

  Serial2.print(red);
  Serial2.print(" ");
  Serial2.print(green);
  Serial2.print(" ");
  Serial2.print(blue);
  Serial2.print("\n");

  Serial.print("RGB send : ");
  Serial.print(red);
  Serial.print(" ");
  Serial.print(green);
  Serial.print(" ");
  Serial.print(blue);
  Serial.print("\n");

  delay(1000);
}

โค้ด ESP

#include <SoftwareSerial.h>

SoftwareSerial mySerial(D4, D3); // RX, TX

void setup() {
  Serial.begin(115200);
  mySerial.begin(9600);
}

void loop() {
  // if there's any serial available, read it:
  while (mySerial.available() > 0) {
    // look for the next valid integer in the incoming serial stream:
    int red = mySerial.parseInt();
    // do it again:
    int green = mySerial.parseInt();
    // do it again:
    int blue = mySerial.parseInt();

    // look for the newline. That's the end of your sentence:
    if (mySerial.read() == '\n') {
      // print the three numbers in one string as hexadecimal:
      Serial.print("RGB receive : ");
      Serial.print(red, DEC);
      Serial.print(" ");
      Serial.print(green, DEC);
      Serial.print(" ");
      Serial.println(blue, DEC);
    }
  }
}

ผลลัพธ์ ด้านซ้ายจะเป็นบอร์ด STMที่จะสุ่มค่าแล้วส่งไปยัง ESP

ด้านขวาจะเป็น ESP ซึ่งรับค่าจาก STM และแสดงค่าออกมาก

No responses yet

ใส่ความเห็น

อีเมลของคุณจะไม่แสดงให้คนอื่นเห็น