การสื่อสารแบบ Serial กับ Parallel

ลักษณะการใช้งาน ความแตกต่างของ Serial Communication

iCreativeSystems
Published in
3 min readMay 16, 2019

--

Embedded คืออะไรก็ตามที่เกี่ยวข้องกับการเชื่อมโยงวงจร (Processors หรือวงจรอื่น ๆ เข้าด้วยกัน) เพื่อสร้างให้เป็นระบบเดียวรวมกัน โดยแต่ละวงจรที่มาประกอบกันจะแลกเปลี่ยนข้อมูลผ่านทาง Protocol ซึ่ง Protocol ถูกกำหนดขึ้นมาเพื่อใช้ในการแลกเปลี่ยนข้อมูล โดยทั่วไปเราจะสามารถแยก Protocol ได้เป็น 2 ประเภทคือ Parallel หรือ Serial

Parallel เทียบกับ Serial

รูปแบบ Parallel จะสามารถโอนข้อมูลได้หลาย bit ในเวลาเดียวกัน การส่งข้อมูลแบบนี้ต้องการบัสข้อมูล(Data Bus)จำนวนมาก อาจจะเป็น 8 เส้น 16 เส้นหรือมากกว่านั้น โดยข้อมูลที่ถูกส่งจะเป็น 0 กับ 1

บัสข้อมูล 8-bit ที่ส่งสัญญาณทุกครั้งที่เกิด pulse ของสัญญาณ clock ใช้สายไฟทั้งหมด 9 เส้น

รูปแบบ Serial จะสตรีมข้อมูลครั้งละ 1 bit รูปแบบ Serial นี้สามารถจะใช้สายส่งข้อมูลเพียงแค่สายเดียวได้ โดยปกติก็จะใช้ไม่เกิน 4 สาย

ตัวอย่างรูปแบบ Serial ที่ส่งข้อมูล 1 bit ทุกครั้งที่เกิด pulse ของสัญญาณ clock ต้องการสายไฟแค่ 2 สาย

ให้เราลองจินตนาการว่ารูปแบบ Parallel เป็นถนนทางหลวง 8 เลน ในขณะที่รูปแบบ Serial เป็นถนนชนบท 2 เลน ในระยะเวลาที่กำหนดไว้ถนนทางหลวงอาจทำให้ผู้คนจำนวนมากไปถึงที่หมายได้มากกว่า แต่ถนนชนบทนั้นให้บริการตามวัตถุประสงค์และค่าใช้จ่ายในส่วนของทุนการสร้าง

การสื่อสารแบบ Parallel มีประโยชน์แน่นอน ทั้งความรวดเร็ว การออกแบบและการใช้งานที่ง่าย แต่ก็จะต้องใช้ช่องข้อมูล(I/O)จำนวนมาก หากต้องย้าย Project จากบนบอร์ด Arduino Uno ไปบนบอร์ด Mega คุณจะเข้าใจว่าช่องข้อมูลบน Processor มีค่ามากเพราะจำนวนช่องข้อมูลที่น้อยลง ดังนั้นเราจึงมักเลือกใช้รูปแบบ Serial แม้ต้องยอมสูญเสียความเร็วไปแต่ก็เพื่อประหยัดช่องข้อมูลบนบอร์ด

ตัวอย่างสัญญาณ Serial เช่น I²C, SPI, RS-232

ตัวอย่างสัญญาณ Parallel เช่น LPT, HDMI

ควรอ่าน : Async ดีกว่า Sync จริงหรือ ?, ความแตกต่างของ Analog กับ Digital

กฎของการใช้ Serial Protocol

Serial Protocol แบบ Asynchronous จะมีกลไกในตัวเองจำนวนหนึ่ง ที่จะช่วยให้เรามั่นใจได้ว่าการโอนถ่ายข้อมูลนั้นสมบูรณ์ไม่มีข้อผิดพลาด กลไกเราพวกนี้ทำให้เราสามารถละทิ้งสัญญาณ clock จากภายนอกได้คือ

  • Data bits
  • Synchronization bits
  • Parity bits
  • Baud rate

ด้วยกลไกการส่งสัญญาณที่หลากหลาย คุณจะพบว่าไม่ได้มีเพียงแค่วิธีเดียวในการส่งข้อมูลแบบ Serial ซึ่งจริง ๆ แล้ว Protocol สามารถตั้งค่าได้มากมาย ส่วนที่สำคัญคือการทำให้แน่ใจว่า อุปกรณ์บนบัส Serial ได้รับการตั้งค่าให้ใช้ Protocol เดียวกัน

Baud rate(อัตราการรับส่งข้อมูล)

Baud rate จะเป็นตัวกำหนดความเร็วในการส่งข้อมูลผ่านทางสาย Serial โดยปกติจะมีหน่วยเป็น bits per second(bps) หากคุณคิดกลับคุณสามารถใช้ Baud rate คำนวนเพื่อรู้ว่าใช้เวลาเท่าใดในการส่งข้อมูล 1 bit ซึ่งค่านี้จะเป็นตัวกำหนดระยะเวลาการส่งข้อมูลในสาย Serial

อัตราการรับส่งข้อมูล มีข้อกำหนดเพียงข้อเดียวคืออุปกรณ์ทั้งสองทำงานในอัตราเดียวกัน อัตราความเร็วรับส่งข้อมูลแบบ “มาตรฐาน” จะมี 1200, 2400, 4800, 19200, 38400, 57600 และ 115200 หน่วยเป็น bps

ยิ่งอัตรารับส่งข้อมูลสูงขึ้นก็จะรับส่งได้เร็วขึ้น แต่โดยปกติคุณจะไม่เห็นใครใช้ความเร็วเกิน 115200 bps สำหรับ Microcontroller เพราะเมื่ออัตรารับส่งสูงเกินไป การทำงานจะเริ่มผิดพลาดจากสัญญาณ clock และช่วงเวลาการสุ่มตัวอย่างไม่สามารถติดตามได้

Framing the data(การทำกรอบข้อมูล)

แต่ละบล๊อก (ปกติจะเป็น byte) ของข้อมูลที่ส่งไปจะอยู่ในรูปของ packet หรือ frame ของ bit โดย frame จะถูกสร้างให้มี parity bit ของข้อมูลของเรา

ทีนี้เรามาลองดูภายใน frame แบบละเอียดกันว่ามีอะไรบ้าง

Data chunk โดยภายในของ serial packet ทุกอันจะมีกลุ่มข้อมูลอยู่ ที่เราเรียกรวมว่ากลุ่มข้อมูลเพราะไม่มีการระบุจำนวนที่แน่ชัด จะรู้เพียงแค่ในแต่ละ packet จะตั้งค่าให้มีข้อมูลได้ตั้งแต่ 5 ถึง 9 bit

Synchronization bits เป็น bit พิเศษเพราะมี 2–3 bit ที่ถูกส่งไปพร้อมกับ Data chunk แต่ละอัน ตัวมันจะเป็นทั้ง bit เริ่มต้น(Start) และ bit สิ้นสุด(Stop) โดยจำนวนของ bit เริ่มต้นจะเป็น 1 bit เสมอแต่จำนวนของ bit สิ้นสุดเลือกได้ว่าจะให้เป็น 1 หรือ 2 bit (โดยทั่วไปมักเป็น 1 bit)

bit เริ่มต้นจะถูกกำหนดโดยสายข้อมูล(Data Line) ว่าจะเป็น LOW หรือ HIGH แต่ bit หยุดจะเป็นค่าเดียวกับสถานะว่าง (Idle)

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

Parity bit เป็นรูปแบบในการตรวจสอบข้อผิดพลาดระดับต่ำที่ทำได้ง่ายมาก ตัวมันมี 2 รูปแบบคือ คี่(ODD) หรือ คู่(EVEN)

  • พาริตีบิตคู่ จะมีค่าเป็น 1 เมื่อจำนวนของเลข 1 ในข้อมูลเป็นจำนวนคี่ (ซึ่งจะทำให้จำนวนเลข 1 ทั้งหมดเป็นจำนวนคู่ เมื่อรวมกับบิตนี้)
  • แพริตีบิตคี่ จะมีค่าเป็น 1 เมื่อจำนวนของเลข 1 ในข้อมูลเป็นจำนวนคู่ (ซึ่งจะทำให้จำนวนเลข 1 ทั้งหมดเป็นจำนวนคี่ เมื่อรวมกับบิตนี้)

Parity bit เป็นแค่ทางเลือกจะใช้หรือไม่ใช้ก็ได้ ไม่ได้ใช้อย่างแพร่หลายมันมีประโยชน์เมื่อมีการส่งผ่านวิธีที่มี Noise เยอะ เพราะมันจะทำให้การส่งข้อมูลของเราช้าลง (เมื่อข้อมูลผิดพลาดจะส่งให้กันใหม่อีกรอบ)

เท่านี้เราก็คงพอเข้าใจการส่งข้อมูลแบบ Serial ขึ้นมาประมาณนึงแล้ว ว่ามีทั้ง ใช้สัญญาณ clock, กำหนด Baud rate หรือใช้ Synchronization bits ในการที่เราจะรับส่งข้อมูลระหว่างอุปกรณ์ได้อย่างถูกต้อง

ถ้าชอบบทความนี้สามารถกดปรบมือเป็นกำลังใจหรือกดติดตามกันได้นะครับ

REFERENCE

  1. https://learn.sparkfun.com/tutorials/serial-communication/all
  2. https://electronics.stackexchange.com/questions/243103/start-bit-and-idle-data-line

--

--

iCreativeSystems

I always self-study about electronic devices and computer programming, So, I will share what I have learned for all of you! Sometime It’s code for Python