เรื่องเล่าจากสาย Serial ตอนที่ 1: UART คืออะไร?
Serial communication
Highlight
บทความนี้จะพาไปทำความรู้จักกับระบบสื่อสารข้อมูลในวงจรอิเล็กทรอนิกส์และระบบ Embedded Systems โดยการส่งข้อมูลสามารถแบ่งตามวิธีการส่งได้เป็น 2 รูปแบบหลัก ได้แก่
– Parallel Communication: ส่งข้อมูลหลายบิตพร้อมกัน จึงสามารถส่งข้อมูลได้หลายบิตในหนึ่งช่วงเวลา แต่ต้องใช้สายสัญญาณและขา MCU จำนวนมาก
– Serial Communication: ส่งข้อมูลเรียงตามลำดับทีละบิต ช่วยลดจำนวนสายสัญญาณและขา MCU ที่ต้องใช้
การสื่อสารแบบ Serial ยังแบ่งตามวิธีการกำหนดจังหวะการรับส่งข้อมูลได้เป็น 2 รูปแบบ ได้แก่
– Synchronous Serial: ใช้สัญญาณ Clock ร่วมกันเพื่อกำหนดจังหวะการรับส่งข้อมูล เช่น SPI และ I2C
– Asynchronous Serial: ไม่มีสาย Clock แยกต่างหากระหว่างอุปกรณ์ แต่ต้องอาศัยการตั้งค่าการสื่อสารที่สอดคล้องกัน เช่น Baud Rate และรูปแบบ Data Frame ตัวอย่างที่พบได้บ่อยคือ UART
บทความนี้จะเน้นทำความเข้าใจการทำงานของ UART (Universal Asynchronous Receiver/Transmitter) ตั้งแต่พื้นฐานการรับส่งข้อมูล ไปจนถึงองค์ประกอบต่าง ๆ ที่เกี่ยวข้องกับการสื่อสาร
เบื้องหลังวงจรอิเล็กทรอนิกส์และระบบ Embedded Systems ที่เราเห็นกันชินตา ไม่ว่าจะเป็นบอร์ดไมโครคอนโทรลเลอร์ เซนเซอร์ หรือชิปประมวลผล ต่างทำงานร่วมกันเปรียบเสมือนสิ่งมีชีวิตที่ต้องพึ่งพาอาศัยกัน และหัวใจสำคัญที่ทำให้วงจรเหล่านี้สื่อสารกันรู้เรื่อง ก็คือ Communication Protocol หรือภาษากลางในการแลกเปลี่ยนข้อมูลนั่นเอง
แม้ในโลกเทคโนโลยีจะมีโพรโทคอล (Protocol) ถูกคิดค้นออกมานับร้อยรูปแบบ แต่หากมองในเชิงโครงสร้างพื้นฐาน การรับส่งข้อมูลจะถูกแบ่งออกเป็น 2 ตระกูลหลักเสมอ นั่นคือ Parallel (แบบขนาน) และ Serial (แบบอนุกรม)
Parallel Communication
เป็นการส่งข้อมูลครั้งละหลายๆ บิตพร้อมกันผ่านสายสัญญาณหลายเส้น (Data Bus) เช่น 8 บิต, 16 บิต หรือมากกว่านั้น ลองจินตนาการถึง ไฮเวย์ขนาดใหญ่ 8 เลน ที่ปล่อยรถให้วิ่งขนานกันไปเป็นตับ ข้อมูลจะถูกซัดเข้าหาปลายทางเหมือนคลื่นยักษ์ตามจังหวะ สัญญาณนาฬิกา (Clock Pulse)
• ข้อดี: ส่งข้อมูลได้เร็วทันใจ โครงสร้างเข้าใจง่าย ไม่ต้องเสียเวลาต่อคิว
• ข้อเสีย: ใช้สายสัญญาณมากกว่า เช่น การส่งข้อมูล 1 ไบต์ (8 บิต) อาจต้องใช้สายไฟรวม Clock ถึง 8-9 เส้น!

Serial Communication
ตรงกันข้ามกับแบบขนาน Serial จะเรียงข้อมูลต่อกันเป็นแถวเดี่ยว และส่งออกไป ทีละ 1 บิต ต่อหนึ่งจังหวะ Clock เหมือน ถนนเลนเดี่ยวในชนบท ที่รถต้องวิ่งตามหลังกันไปทีละคัน แม้จะดูลำเลียงคนได้ช้ากว่าไฮเวย์หลายเลนในเวลาเท่ากัน แต่ถนนเลนเดี่ยวกลับสร้างง่าย และใช้พื้นที่น้อยกว่ามหาศาล เพราะระบบ Serial ใช้สายสัญญาณน้อยมาก โดยทั่วไปจะใช้เพียง 1 ถึง 4 เส้นเท่านั้น

ทำไม Serial Communication ถึงครองใจนักพัฒนา?
ในการออกแบบโปรเจกต์อิเล็กทรอนิกส์ นักพัฒนาหลายคนคงเคยเจอกับฝันร้ายที่เรียกว่า “ขาไอโอ (I/O หรือ input/output) ไม่พอ”
ใครที่เคยขยับขยายโปรเจกต์จากบอร์ดเล็กอย่าง Arduino Uno ไปเป็น Arduino Mega เพียงเพราะจำนวนขาใช้งานได้เริ่มไม่เพียงพอ คงเข้าใจดีว่า Pin Real Estate หรือพื้นที่ขาบนไมโครคอนโทรลเลอร์นั้นมีค่ามากแค่ไหน
แม้การสื่อสารแบบ Parallel Communication จะสามารถส่งข้อมูลหลายบิตพร้อมกันได้ แต่ก็ต้องแลกมาด้วยการใช้เส้นสัญญาณจำนวนมาก ในทางกลับกัน Serial Communication จะทยอยส่งข้อมูลผ่านเส้นทางข้อมูล ทำให้สามารถลดจำนวนสายสัญญาณและขา I/O ที่ต้องใช้ลงได้อย่างมาก
นี่จึงเป็นเหตุผลสำคัญที่ทำให้การสื่อสารแบบ Serial ได้รับความนิยมในงาน Embedded Systems ตั้งแต่การรับส่งข้อมูลระหว่างไมโครคอนโทรลเลอร์กับเซนเซอร์ ไปจนถึงการเชื่อมต่อโมดูลสื่อสาร อุปกรณ์จัดเก็บข้อมูล และคอมพิวเตอร์เพื่อใช้ตรวจสอบการทำงานของระบบ
อย่างไรก็ตาม Serial Communication สามารถแบ่งตามวิธีการซิงโครไนซ์ (Synchronize) จังหวะในการรับส่งข้อมูลได้เป็น 2 รูปแบบหลัก ได้แก่ Synchronous Serial ซึ่งใช้สัญญาณนาฬิกา (Clock Signal) ร่วมในการกำหนดจังหวะการรับส่งข้อมูล และ Asynchronous Serial ซึ่งไม่จำเป็นต้องใช้สัญญาณนาฬิการ่วมระหว่างอุปกรณ์ โดยทั้งสองรูปแบบมีหลักการทำงาน ข้อดี และข้อจำกัดที่แตกต่างกัน
ในบทความนี้ เราจะพาไปทำความเข้าใจหลักการของการสื่อสารทั้งสองรูปแบบ พร้อมดูว่ามันทำงานอย่างไร และควรเลือกใช้แบบไหนให้เหมาะกับโปรเจกต์ของคุณ
ความสำคัญของสัญญาณนาฬิกา (Clock Signal)
ก่อนที่จะทำความเข้าใจว่า Synchronous และ Asynchronous คืออะไร เรามาทำความเข้าใจถึงความสำคัญของสัญญาณนาฬิกา (Clock Signal) ในงานอิเล็กทรอนิกส์กันก่อน
สมมติว่าเราต้องการส่งข้อมูลไบนารี 100110 ไปยังคอมพิวเตอร์อีกเครื่องหนึ่ง โดยกำหนดให้แรงดันไฟฟ้า 5V แทนลอจิก 1 และ 0V แทนลอจิก 0
จากรูปที่ 3 จะเห็นว่าเราสามารถใช้แรงดันไฟฟ้าแทนข้อมูล 0 และ 1 ได้ แต่ยังมีปัญหาอยู่ว่า ตัวรับจะรู้ได้อย่างไรว่าต้องอ่านข้อมูลตอนไหน และข้อมูลแต่ละบิตมีจำนวนกี่บิต?
ตัวอย่างเช่น เมื่อได้รับสัญญาณระดับ 5V ต่อเนื่องกัน ตัวรับจะรู้ได้อย่างไรว่าข้อมูลที่ส่งมาคือ 1 หนึ่งบิต หรือ 111 สามบิต?
นี่จึงเป็นเหตุผลที่เราต้องมีวิธีกำหนดจังหวะในการรับส่งข้อมูล เพื่อให้ตัวรับสามารถอ่านข้อมูลได้อย่างถูกต้อง
ดังนั้น การส่งข้อมูลจึงจำเป็นต้องมีวิธีที่ช่วยให้ตัวรับและตัวส่งเข้าใจจังหวะเวลาในการรับส่งข้อมูลได้ตรงกัน ซึ่ง สัญญาณนาฬิกา (Clock Signal) เป็นหนึ่งในวิธีที่ใช้กำหนดจังหวะดังกล่าว และเป็นพื้นฐานสำคัญของการสื่อสารข้อมูลแบบ Synchronous

ดังนั้น จึงมีการใช้ Clock Signal เพื่อกำหนดจังหวะในการอ่านข้อมูล โดยสามารถทำความเข้าใจได้ง่าย ๆ จากตัวอย่างสมมติว่า เรากำหนดให้ตัวรับอ่านค่าสัญญาณทุก ๆ 1 วินาที เมื่อถึงเวลาที่กำหนด ตัวรับจะตรวจสอบระดับแรงดันไฟฟ้าว่าเป็น 5V ซึ่งแทนลอจิก 1 (High) หรือ 0V ซึ่งแทนลอจิก 0 (Low) ดังรูปที่ 4

Synchronous Serial Interface คืออะไร?
เมื่อเราทำความเข้าใจเรื่อง clock signal แล้วต่อไปจะกล่าวถึง Synchronous Serial Interface คือการรับส่งข้อมูลที่มี สัญญาณนาฬิกา (Shared Clock) คอยกำหนดจังหวะให้อุปกรณ์ทั้งสองฝั่งทำงานสอดคล้องกัน
โดยทั่วไป การสื่อสารรูปแบบนี้จะมีอุปกรณ์ Master ทำหน้าที่สร้างสัญญาณนาฬิกา (SCLK/SCK) แล้วส่งผ่านสายสัญญาณแยกต่างหากไปยังอุปกรณ์ Slave เพื่อบอกว่า “ต้องอ่านหรือส่งข้อมูลในจังหวะไหน” ทำให้ทั้งสองฝั่งรับส่งข้อมูลได้ตรงจังหวะกัน

ทำไม Synchronous ถึงรับส่งข้อมูลได้เร็วกว่า?
การใช้สายสัญญาณ Clock แยกต่างหาก ช่วยให้อุปกรณ์รับส่งข้อมูลได้อย่างมีประสิทธิภาพมากขึ้น ด้วยเหตุผลหลัก ๆ ดังนี้
- รู้จังหวะการรับส่งข้อมูลอย่างชัดเจน: สัญญาณ Clock ทำหน้าที่กำหนดจังหวะให้อุปกรณ์รับรู้ว่าควรอ่านข้อมูลเมื่อใด จึงช่วยให้การรับส่งข้อมูลระหว่างอุปกรณ์เป็นไปอย่างสอดคล้องกัน
- ลดบิตส่วนเกินในการส่งข้อมูล: การสื่อสารแบบ Synchronous สามารถส่งข้อมูลต่อเนื่องได้โดยไม่จำเป็นต้องเพิ่ม Start Bit และ Stop Bit ให้กับข้อมูลทุกไบต์เหมือนการสื่อสารบางรูปแบบ จึงช่วยลดจำนวนบิตที่ใช้ในการควบคุมการรับส่งข้อมูล
- รองรับความเร็วในการรับส่งข้อมูลสูง: เมื่อมี Clock คอยกำหนดจังหวะ และสามารถลดบิตส่วนเกินบางส่วนได้ Synchronous จึงรองรับการรับส่งข้อมูลด้วยความเร็วสูงได้ โดยความเร็วจริงขึ้นอยู่กับอินเทอร์เฟซ อุปกรณ์ และข้อจำกัดของระบบด้วย
ตัวอย่างการใช้งานจริงในวงการอิเล็กทรอนิกส์
โพรโทคอลแบบ Synchronous Serial ที่เราพบเห็นได้บ่อยที่สุดในโปรเจกต์อิเล็กทรอนิกส์และวงการไมโครคอนโทรลเลอร์ ได้แก่:
- SPI (Serial Peripheral Interface): โพรโทคอลความเร็วสูงที่นิยมใช้เชื่อมต่อกับจอแสดงผล TFT, SD Card Module หรือเซนเซอร์ที่ต้องการ throughput สูง
- I2C (Inter-Integrated Circuit): โพรโทคอลยอดนิยมที่ใช้สายสัญญาณเพียง 2 เส้น (SDA สำหรับข้อมูล และ SCL สำหรับ Clock) ในการเชื่อมต่อเซนเซอร์และโมดูลต่างๆ จำนวนมากเข้าด้วยกันบนบัสเดียว
- USB (Universal Serial Bus) โพรโทคอลความเร็วสูงที่นิยมมากในปัจจุบัน ทั้งใช้ในการสื่อสารกับคอมพิวเตอร์ และ การสื่อสารระหว่างไมโครคอนโทรลเลอร์

Asynchronous Serial Interface คืออะไร?
หลังจากที่เราได้รู้จักกับ Synchronous Serial Interface ซึ่งใช้สัญญาณนาฬิกา (Clock Signal) ในการกำหนดจังหวะรับส่งข้อมูลไปแล้ว คราวนี้เราจะมาทำความรู้จักกับ Asynchronous Serial Interface อีกหนึ่งรูปแบบที่ใช้งานกันอย่างแพร่หลาย
ในหัวข้อนี้ เราจะมาเรียนรู้หลักการทำงานของ Asynchronous Serial พร้อมทำความเข้าใจพารามิเตอร์พื้นฐานที่จำเป็นสำหรับการเชื่อมต่อและเขียนโปรแกรมสื่อสารผ่าน Serial Port
Asynchronous Serial Interface: สื่อสารได้อย่างไรแบบไม่มี Clock ร่วม (Shared Clock)
คำว่า Asynchronous หมายถึงการสื่อสารที่ไม่ต้องใช้สัญญาณนาฬิกา (Clock Signal) ร่วมกันระหว่างอุปกรณ์ทั้งสองฝั่ง
จุดเด่นคือ ไม่จำเป็นต้องมีสาย Clock แยกสำหรับส่งข้อมูล เหมือนการสื่อสารแบบ Synchronous แต่จะใช้วิธีอื่นช่วยให้ตัวรับรู้ว่าต้องเริ่มอ่านข้อมูลเมื่อไร เช่น การใช้ Start bit ใน UART
ด้วยเหตุนี้ Asynchronous Serial จึงเหมาะอย่างยิ่งสำหรับการสื่อสารระยะไกล (Long-distance Communications) หรือระบบที่ต้องการลดจำนวนสายสัญญาณให้น้อยที่สุด และต้องการเสถียรภาพในการเชื่อมต่อ

เมื่อไม่มีสาย Clock… แล้วส่งข้อมูลให้ตรงกันได้อย่างไร?
เมื่อการสื่อสารแบบ Asynchronous ไม่มีสายสัญญาณ Clock ร่วมระหว่างอุปกรณ์ แล้วฝั่งรับรู้ได้อย่างไรว่าต้องอ่านข้อมูลตอนไหน?
คำตอบคือ ทั้งฝั่งส่ง (Transmitter) และฝั่งรับ (Receiver) จะสร้างสัญญาณนาฬิกา (clock signal) ภายในของตัวเองในการกำหนดจังหวะรับส่งข้อมูล โดยทั้งสองฝั่งต้องตั้งค่าความเร็วในการสื่อสารให้ตรงกัน เพื่อให้ฝั่งรับอ่านข้อมูลได้ถูกต้อง

ตัวอย่างที่คุ้นเคย
ตัวอย่างของการสื่อสารแบบ Asynchronous ที่พบได้บ่อย คือการใช้ UART บนไมโครคอนโทรลเลอร์ เช่น การส่งข้อมูลจาก Arduino ไปยังคอมพิวเตอร์เพื่อแสดงผลผ่าน Serial Monitor
นอกจากนี้ ยังมีมาตรฐานการสื่อสารที่ใช้กันอย่างแพร่หลาย เช่น RS-232 ซึ่งพบได้ในอุปกรณ์และพอร์ต Serial บางประเภท, RS-422 และ RS-485 ที่นิยมใช้ในงานสื่อสารระหว่างอุปกรณ์ โดยเฉพาะในระบบอุตสาหกรรม

มารู้จัก UART กันเถอะ
UART (Universal Asynchronous Receiver/Transmitter) คือ Peripheral สำหรับการสื่อสารข้อมูลแบบ Asynchronous Serial ที่นิยมใช้งานอย่างแพร่หลายในระบบ Embedded System
โดยทั่วไป เมื่อพูดถึงการสื่อสารผ่าน Serial Port ระหว่าง MCU กับ Computer ในบริบทของการพัฒนาโปรแกรม Embedded System เรามักพบการสื่อสารผ่าน UART หรือ UART-compatible interface อย่างไรก็ตาม คำว่า Serial เป็นคำที่มีความหมายกว้างกว่า UART และไม่ได้หมายถึง UART เสมอไป เช่น USB CDC (Communication Device Class) ซึ่งเป็นวิธีสื่อสารผ่าน USB ที่สามารถจำลองพอร์ต Serial ให้กับโปรแกรมบน Computer ได้
หน้าที่สำคัญอย่างหนึ่งของ UART คือการแปลงข้อมูลจาก Parallel ภายในระบบดิจิทัลให้เป็น Serial สำหรับส่งออกทาง TX และแปลงข้อมูล Serial ที่รับเข้าทาง RX กลับเป็นข้อมูล Parallel เพื่อให้ MCU นำไปประมวลผลต่อได้
ตัวอย่างการใช้งาน UART บน Arduino มีดังนี้
void setup() {
Serial.begin(9600); // Setup buad rate
}
void loop() {
Serial.println("Hello ");
delay(1000);
}คำสั่ง Serial.begin(9600); ใช้สำหรับเริ่มต้นการสื่อสาร Serial โดยกำหนดความเร็วในการรับส่งข้อมูลไว้ที่ 9600 baud
ส่วนคำสั่ง Serial.println("Hello"); ใช้ส่งข้อความ Hello ออกไปแสดงผลบน Serial Monitor ของ Computer โดยหลังจากส่งข้อความเสร็จ จะมีการขึ้นบรรทัดใหม่ให้อัตโนมัติ
ลองนึกภาพว่า MCU ต้องการส่งข้อความ Hello ไปยัง Computer ตัวอักษรแต่ละตัวจะถูกส่งออกไปตามลำดับ ผ่านช่องทางการสื่อสาร Serial จน Computer ได้รับข้อมูลครบและแสดงข้อความออกมาบนหน้าจอ

เจาะลึกการทำงาน UART

UART รับส่งข้อมูลโดยไม่มี Clock ได้อย่างไร?
เนื่องจาก UART เป็นการสื่อสารแบบ Asynchronous Serial จึงไม่มีสาย Clock แยกสำหรับกำหนดจังหวะการรับส่งข้อมูลร่วมกันระหว่างอุปกรณ์ทั้งสองฝั่ง (รูปที่
แล้วอุปกรณ์ทั้งสองฝั่งจะรู้ได้อย่างไรว่าต้องเริ่มรับข้อมูลเมื่อไร และต้องอ่านข้อมูลด้วยความเร็วเท่าไร?
คำตอบคือ UART ใช้การกำหนดค่าการสื่อสารร่วมกัน และอาศัยบิตพิเศษที่เรียกว่า Start bit และ Stop bit เพื่อช่วยให้ตัวรับสามารถตรวจจับจุดเริ่มต้นและจุดสิ้นสุดของข้อมูลได้ โดยมีองค์ประกอบสำคัญดังนี้
- Baud rate — กำหนดอัตราการส่งสัญญาณ ซึ่งต้องตั้งค่าให้สอดคล้องกันทั้งฝั่งส่งและฝั่งรับ
- Start bit และ Stop bit — ใช้ระบุจุดเริ่มต้นและจุดสิ้นสุดของการส่งข้อมูลแต่ละเฟรม
- Data bits — กำหนดจำนวนบิตที่ใช้แทนข้อมูลจริงในแต่ละเฟรม เช่น 7 หรือ 8 บิต
- Parity bit — บิตเสริมที่ใช้ช่วยตรวจสอบความผิดพลาดของข้อมูล โดยสามารถเลือกใช้งานหรือไม่ใช้งานก็ได้
UART สามารถกำหนดรูปแบบการรับส่งข้อมูลได้หลายแบบตามความต้องการของระบบ อย่างไรก็ตาม อุปกรณ์ทั้งสองฝั่งต้องตั้งค่าการสื่อสารที่เกี่ยวข้องให้ตรงกัน เพื่อให้ตัวรับสามารถอ่านและตีความข้อมูลได้อย่างถูกต้อง
โดยทั่วไป UART ใช้สายสัญญาณ 2–3 สายในการสื่อสารระหว่างอุปกรณ์ 2 ตัว ได้แก่
- TX (Transmit) — ขาส่งข้อมูลจาก UART ภายใน MCU
- RX (Receive) — ขารับข้อมูลเข้าสู่ UART ภายใน MCU
- GND (Ground) — สายกราวด์ที่ใช้เป็นจุดอ้างอิงแรงดันร่วมกันระหว่างอุปกรณ์ทั้งสอง
สำหรับการสื่อสารสองทาง มักใช้สาย TX และ RX ต่อไขว้กัน พร้อมต่อ GND ร่วมกัน รวมเป็น 3 สาย ส่วนการสื่อสารทางเดียวอาจใช้เพียง TX, RX และ GND ตามความจำเป็นของระบบ
Baud rate: สิ่งสำคัญในการสื่อสาร UART
Baud rate คืออัตราการส่งจำนวนบิตที่ส่งได้ในหนึ่งวินาที ตัวอย่างเช่น หากอัตราการส่งข้อมูลอยู่ที่ 120 ตัวอักษรต่อวินาที และแต่ละตัวอักษรประกอบด้วย 10 บิต อัตราบอดของการส่งข้อมูลดังกล่าวจะเท่ากับ 10 × 120 = 1200 บิตต่อวินาที หรือ 1200 บอด (baud rate)
สูตรการคำนวณ Baud rate
1. ความสัมพันธ์ระหว่าง Baud Rate และระยะเวลาต่อ 1 บิต ()
หากทราบค่า Baud Rate จะสามารถหาช่วงเวลาที่สัญญาณคงอยู่ที่ระดับ HIGH/LOW ในการส่ง 1 บิต ได้จากสูตร:
โดยที่:
- คือ ระยะเวลาในการส่งข้อมูล 1 บิต (มีหน่วยเป็นวินาที : s)
- B คือ Baud Rate (มีหน่วยเป็น Baud หรือ Pulse/s)
ตัวอย่าง: หากใช้ Baud Rate 9600 Baud rate
ตัวอย่างการคำนวณในงานจริง
ถ้าต้องการส่งตัวอักษร 20 ตัว ด้วยความเร็ว Buad rate 9600 จะใช้เวลาส่งทั้งหมดเท่าไหร่
1. ในการส่งข้อมูลแบบ Asynchronous Serial การส่งตัวอักษร 1 ตัว (1 ไบต์ = 8 บิต) จะต้องมีการแปะ Start Bit และ Stop Bit เสมอเพื่อให้ฝั่งรับรู้จังหวะเริ่มต้นและจบข้อมูล:
- 1 ตัวอักษร (1 Frame) = 1 Start Bit + 8 Data Bits + 1 Stop Bit = 10 Bits
- ส่งตัวอักษร 10 ตัว คำนวณได้ดังนี้
คือ จำนวนตัวอักษรที่ต้องการส่งทั้งหมดใน 1 ครั้ง
คือ จำนวนบิต ต่อ 1 เฟรม (ปกติ 1 เฟรมเท่ากับ 1 ตัวอักษร)
2. คำนวณเวลาที่ใช้ในการส่ง 1 บิต
ที่ Baud Rate 9600 (ส่งได้ 9,600 บิต ใน 1 วินาที ):
3. คำนวณเวลารวมในการส่งตัวอักษร 20 ตัว
ดังนั้นใช้เวลาส่งข้อมูล 10 ตัวอักษร คือ 20.834 มิลลิวินาที
สิ่งที่ควรรู้: Baud rate มีผลต่อการออกแบบระบบและการเขียนโปรแกรม โดยต้องคำนึงถึงความเร็วในการรับส่งข้อมูลและความสามารถในการประมวลผลของอุปกรณ์ เพื่อป้องกันไม่ให้ข้อมูลเข้ามาเร็วกว่าที่โปรแกรมจะอ่านหรือประมวลผลได้ทัน จนอาจทำให้ข้อมูลสูญหาย
แล้วต้องใช้ความเร็วเท่าไหร่ดี?
ความเร็ว Baud Rate จะตั้งเป็นค่าเท่าไหร่ก็ได้ตราบใดที่สมเหตุสมผล ขอแค่ทั้งฝั่งส่งและฝั่งรับตั้งค่าเท่ากันก็พอ
- ความเร็วยอดนิยม : 9600 bps เหมาะสำหรับงานพื้นฐานทั่วไปที่ไม่เน้นความเร็วสูงมาก
- ค่ามาตรฐานอื่นๆ : 1200, 2400, 4800, 9600, 19200, 38400, 57600 และ 115200 bps
ยิ่งเร็วยิ่งดี… จริงหรือ?
ยิ่ง Baud Rate สูง การรับส่งข้อมูลก็ยิ่งไวขึ้น แต่ระบบการสื่อสารก็มี “ขีดจำกัด” ของมันอยู่ โดยทั่วไปในงานไมโครคอนโทรลเลอร์เรามักจะไม่ค่อยเห็นความเร็วเกิน 115200 bps เพราะหากอัดความเร็วสูงเกินไป สัญญาณนาฬิกาภายใน (Internal Clock) และจังหวะการอ่านสัญญาณของฝั่งรับจะเริ่มไล่ตามไม่ทัน จนเกิดข้อผิดพลาดในการรับข้อมูล (Data Errors) ในที่สุด
โดยทั่วไป การใช้งาน UART บน Arduino หรือ ESP32 ผ่าน Library ผู้ใช้มักกำหนดเพียง Baud rate เช่น
9600หรือ115200ส่วนการตั้งค่าอื่น ๆ เช่น Data bits, Parity bit และ Stop bit มักใช้ค่าเริ่มต้นของ Library ซึ่งผู้ใช้ไม่จำเป็นต้องกำหนดเองเสมอไป
อย่างไรก็ตาม การเข้าใจหลักการทำงานของ UART และการตั้งค่าแต่ละส่วน จะช่วยให้เราเข้าใจปัญหาที่เกิดขึ้นและแก้ไขได้อย่างถูกต้อง โดยเฉพาะเมื่ออุปกรณ์สองฝั่งสื่อสารกันไม่ได้ หรือรับข้อมูลผิดพลาด
Start Bit และ Stop Bit: บิตระบุจุดเริ่มต้นและจุดสิ้นสุดของข้อมูล
ระบบ Asynchronous คือการสื่อสารที่ไม่จำเป็นต้องมีสาย Clock แยกต่างหากเพื่อใช้กำหนดจังหวะการรับส่งข้อมูลระหว่าง Sender และ Receiver โดยอุปกรณ์ทั้งสองฝั่งจะใช้ Clock ภายในของตัวเอง
แล้ว Receiver จะรู้ได้อย่างไรว่าต้องเริ่มอ่านข้อมูลเมื่อไร?
UART ใช้ Start Bit เป็นจุดอ้างอิงในการซิงโครไนซ์จังหวะการรับข้อมูล เมื่อ Receiver ตรวจพบ Start Bit ก็จะเริ่มกำหนดจังหวะในการอ่าน Data Bits ให้สัมพันธ์กับฝั่งส่ง โดยทั่วไปจะอ่านสัญญาณบริเวณกึ่งกลางของแต่ละบิต เพื่อช่วยลดโอกาสในการอ่านข้อมูลผิดพลาด
- Start Bit: มีขนาด 1 บิต ใช้แจ้งให้ Receiver ทราบว่ากำลังเริ่มส่งข้อมูล โดยปกติสัญญาณจะเปลี่ยนจาก HIGH เป็น LOW
- Stop Bit: ใช้ระบุจุดสิ้นสุดของข้อมูลแต่ละชุด โดยทั่วไปสามารถตั้งค่าให้มีความยาว 1 หรือ 2 บิตได้ และมักนิยมใช้ 1 บิต
กลไกนี้ช่วยให้ UART รับส่งข้อมูลได้โดยไม่ต้องมีสาย Clock ร่วมกัน อย่างไรก็ตาม Sender และ Receiver ยังคงต้องตั้งค่า Baud Rate ให้ใกล้เคียงกันมากพอ เพื่อให้ Receiver อ่านข้อมูลได้อย่างถูกต้อง
Data Bits: บิตที่ใช้แทนข้อมูลจริง
Data Bits คือส่วนที่ใช้เก็บข้อมูลที่ต้องการส่งผ่าน UART เช่น ตัวอักษร ตัวเลข หรือข้อมูลจาก Sensor
ในการตั้งค่า UART เราสามารถเลือกจำนวน Data Bits ได้ โดยทั่วไปมักใช้ 8 บิต และบางระบบสามารถเลือกใช้ 5, 6, 7 หรือ 9 บิตได้ ขึ้นอยู่กับอุปกรณ์และ UART ที่ใช้งาน
นอกจากนี้ UART โดยทั่วไปจะส่งข้อมูลแบบ LSB First (Least Significant Bit First) หมายถึงการส่งบิตที่มีนัยสำคัญน้อยที่สุดออกไปก่อน
Data Bits เป็นส่วนหนึ่งของ Data Frame ซึ่งยังประกอบด้วย Start Bit และ Stop Bit รวมถึง Parity Bit หากมีการเปิดใช้งาน

Parity Bit: บิตตรวจสอบความผิดพลาดของข้อมูล
ในการส่งข้อมูลผ่านสาย Serial สัญญาณอาจถูกรบกวนจาก Noise ทำให้ข้อมูลที่รับได้แตกต่างจากข้อมูลที่ส่ง เช่น บิต 0 อาจถูกอ่านผิดเป็น 1
เพื่อช่วยตรวจสอบความผิดพลาดนี้ UART สามารถเพิ่ม Parity Bit เข้าไปอีก 1 บิต โดยบิตนี้จะคำนวณจากจำนวนบิต 1 ในข้อมูลที่ต้องการส่ง ทั้งนี้สามารถเลือกเปิดหรือปิดการใช้งานได้ตามการตั้งค่าของระบบ
Parity Bit มี 2 รูปแบบที่พบได้บ่อย ได้แก่
1. Odd Parity (พาริตี้คี่)
กำหนดให้จำนวนบิต(bit) 1 ทั้งหมด เมื่อรวม Data Bits + Parity Bit แล้ว เป็น จำนวนคี่
- ตัวอย่าง:
- ข้อมูล 8 บิต คือ 10101011 ซึ่งมีบิต 1 จำนวน 5 บิต เติม 0 ที่ Parity bit
- ข้อมูล 8 บิต คือ 00001111 ซึ่งมีบิต 1 จำนวน 4 บิต เติม 1 ที่ Parity bit

2. Even Parity (พาริตี้คู่)
กำหนดให้จำนวนบิต(bit) 1 ทั้งหมด เมื่อรวม Data Bits + Parity Bit แล้ว เป็น จำนวนคู่
- ตัวอย่าง:
- ข้อมูล 8 บิต คือ 10101011 ซึ่งมีบิต 1 จำนวน 5 บิต เติม 1 ที่ Parity bit
- ข้อมูล 8 บิต คือ 00001111 ซึ่งมีบิต 1 จำนวน 4 บิต เติม 0 ที่ Parity bit

ข้อควรรู้: Parity Bit ช่วยตรวจจับความผิดพลาดของข้อมูลได้บางประเภท แต่ไม่สามารถตรวจจับได้ทุกกรณี เช่น หากมีบิตผิดพลาดเป็นจำนวนคู่ (เช่น 2 บิต) การตรวจสอบ Parity อาจไม่พบความผิดพลาดนั้น
สรุปส่งท้าย
การเลือกใช้งานระบบสื่อสารแบบ Serial Communication ไม่ว่าจะเป็น Synchronous หรือ Asynchronous รวมถึงการตั้งค่า Baud Rate, Data Bits, Parity Bit ซึ่งค่าต่างๆ มีผลโดยตรงต่อความเร็ว เสถียรภาพ และประสิทธิภาพในการทำงานของระบบ Embedded Systems การเข้าใจหลักการพื้นฐานเหล่านี้อย่างถ่องแท้ จะช่วยให้เราสามารถออกแบบระบบและแก้ไขปัญหา Bus สื่อสารได้อย่างแม่นยำยิ่งขึ้น
เมื่อเราเข้าใจภาษากลางและโครงสร้างการส่งข้อมูลระดับสัญญาณดิจิทัลกันไปเรียบร้อยแล้ว ในตอนถัดไป เราจะขยับจากการสื่อสารระดับชิปไปสู่ มาตรฐานการสื่อสารบนสายส่งสัญญาณจริงในโลกอุตสาหกรรม (Physical Layer Standards)
เตรียมพบกับเจาะลึก 3 มาตรฐานยอดฮิตที่วิศวกรสาย Hardware และ Automation ต้องเจออยู่เสมอ:
- RS-232: มาตรฐานพอร์ต Serial คลาสสิกสำหรับการสื่อสารระยะใกล้
- RS-422: การอัปเกรดด้วยสัญญาณแบบ Differential รับส่งข้อมูลเร็วขึ้น และไกลขึ้น
- RS-485: รากฐานบัสสื่อสารยอดนิยมในโรงงานอุตสาหกรรม ที่รองรับอุปกรณ์จำนวนมากบนสายคู่ตีเกลียวเพียงคู่เดียว
แล้วพบกันในตอนหน้าครับ
Written by Pawinphat Charoenrat
Reference :
– SparkFun Learn
– Seeedstudio.com
– Circuitdigest.com
– Delightlylinux.wordpress.com
Bunpajarn | Learn • Share • Grow Together.
พื้นที่สำหรับคนที่รักและสนใจ Electronics & Embedded
