บทความนี้จะเป็นการสื่อสารระหว่างบอร์ด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