> For the complete documentation index, see [llms.txt](https://taiphoon-com.gitbook.io/taiphoon.com-docs/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://taiphoon-com.gitbook.io/taiphoon.com-docs/th/support/knowledge-base/uart.md).

# การสื่อสารผ่านพอร์ตอนุกรม (UART)

### UART คืออะไร <a href="#uart" id="uart"></a>

UART (Universal Asynchronous Receiver/Transmitter) คือวิธีการสื่อสารแบบอนุกรมแบบอะซิงโครนัส โดยทั่วไปใช้สายข้อมูลสองเส้นส่งข้อมูลระหว่างอุปกรณ์สองตัว และเป็นหนึ่งในอินเทอร์เฟซการสื่อสารที่พบบ่อยที่สุดในระบบตัวควบคุมการบิน

ในการใช้งานกับโดรนและตัวควบคุมการบิน UART มักใช้เชื่อมต่ออุปกรณ์ เช่น GPS โมดูลเทเลเมทรี ตัวรับสัญญาณ คอมพิวเตอร์ร่วมบิน (Companion Computer) เครื่องวัดระยะ และคอนโซลดีบักของระบบ

### คุณลักษณะของ UART <a href="#uart" id="uart"></a>

UART เป็นการสื่อสารแบบ**จุดต่อจุด (Point-to-Point)** ไม่ใช่บัสที่ใช้ร่วมกันเหมือน I2C หรือ CAN การเชื่อมต่อ UART หนึ่งชุดโดยทั่วไปจะเชื่อมต่ออุปกรณ์เพียงสองตัว และไม่ใช้กลไกที่อยู่ (Address)

ข้อดีของวิธีนี้คือโครงสร้างเรียบง่าย ความเข้ากันได้สูง และใช้งานอย่างแพร่หลาย แต่ก็หมายความว่าอุปกรณ์ต่อพ่วงแต่ละตัวมักต้องใช้ทรัพยากรพอร์ตอนุกรมแยกกันหนึ่งชุด

### สัญญาณพื้นฐานของ UART <a href="#uart" id="uart"></a>

การเชื่อมต่อ UART ขั้นพื้นฐานที่สุดต้องใช้สามสาย:

| สัญญาณ | การใช้งาน         |
| ------ | ----------------- |
| TX     | เอาต์พุตส่งข้อมูล |
| RX     | อินพุตรับข้อมูล   |
| GND    | กราวดอ้างอิงร่วม  |

ตัวควบคุมการบินหรืออุปกรณ์ต่อพ่วงบางรุ่นอาจมี 5V, 3.3V, CTS, RTS หรือสัญญาณควบคุมอื่น ๆ เพิ่มเติมบนพอร์ตเดียวกัน แต่สิ่งสำคัญที่สุดที่ทำให้ UART สื่อสารได้ตามปกติยังคงเป็น TX, RX และ GND

### การต่อ TX / RX แบบไขว้ <a href="#tx--rx" id="tx--rx"></a>

ข้อผิดพลาดการต่อสาย UART ที่พบบ่อยที่สุด คือการต่อ TX และ RX ผิดทิศทาง

วิธีต่อที่ถูกต้องมีดังนี้:

* TX ของอุปกรณ์ A ต่อเข้ากับ RX ของอุปกรณ์ B
* RX ของอุปกรณ์ A ต่อเข้ากับ TX ของอุปกรณ์ B
* GND ทั้งสองฝั่งต้องต่อถึงกัน

กล่าวคือ **ฝั่งส่งต้องต่อเข้ากับฝั่งรับของอีกฝั่งหนึ่ง** หากต่อ TX เข้ากับ TX หรือ RX เข้ากับ RX โดยทั่วไปจะไม่มีข้อมูลใด ๆ ส่งผ่านได้

### ความสำคัญของการต่อกราวดร่วม <a href="#undefined" id="undefined"></a>

แม้จะต่อ TX และ RX ถูกต้องแล้ว หากอุปกรณ์ทั้งสองไม่ได้ต่อกราวดร่วมกัน UART ก็อาจทำงานได้ไม่เสถียร

เนื่องจากสัญญาณ UART ต้องอ้างอิงศักย์กราวดร่วมกัน หากไม่มีกราวดร่วม ฝั่งรับอาจไม่สามารถแยกระดับสัญญาณสูงต่ำได้อย่างถูกต้อง ทำให้ข้อมูลผิดพลาด ขาดหายเป็นช่วง ๆ หรือสื่อสารไม่ได้เลย

### อัตราบอด (Baudrate) <a href="#undefined" id="undefined"></a>

ทั้งสองฝั่งที่สื่อสารผ่าน UART ต้องใช้อัตราบอด (baud rate) เดียวกัน มิฉะนั้นข้อมูลที่ฝั่งรับได้รับมักจะกลายเป็นอักขระขยะหรือข้อมูลที่อ่านไม่ได้

อัตราบอดที่พบบ่อย ได้แก่:

* 9600: ค่าเริ่มต้นที่พบบ่อยใน GPS บางรุ่นหรือเซนเซอร์อย่างง่าย
* 57600: พบบ่อยในคอนโซลดีบักหรือการกำหนดค่าเทเลเมทรีบางแบบ
* 115200: พบบ่อยมากในการเชื่อมต่อ MAVLink, GPS และคอมพิวเตอร์ร่วมบิน
* 921600: อาจใช้สำหรับการส่งข้อมูลความถี่สูงหรือลิงก์ความเร็วสูง แต่มีข้อกำหนดด้านสายและการควบคุมการไหล (Flow Control) สูงกว่า

### ข้อควรระวังเกี่ยวกับอัตราบอด <a href="#undefined" id="undefined"></a>

เมื่อเพิ่มอัตราบอดเป็น 921600 หรือสูงกว่า ความเสถียรของการสื่อสารจะขึ้นอยู่กับคุณภาพสาย ความยาวสาย และการรองรับการควบคุมการไหลแบบฮาร์ดแวร์มากขึ้น

เอกสาร UART ของ ARK ระบุไว้เป็นพิเศษว่า UART ความเร็วสูงหากไม่มีการควบคุมการไหลแบบฮาร์ดแวร์ เช่น CTS/RTS จะสูญเสียแพ็กเก็ตได้ง่ายเมื่อใช้สายยาว จะทำงานได้เสถียรก็ต่อเมื่อเชื่อมต่อระยะสั้นระหว่างบอร์ดกับบอร์ดเท่านั้น

### รูปแบบข้อมูล <a href="#undefined" id="undefined"></a>

ในการใช้งานกับตัวควบคุมการบินและอุปกรณ์ต่อพ่วง รูปแบบข้อมูล UART ที่พบบ่อยที่สุดคือ **8N1** ซึ่งหมายถึง:

* บิตข้อมูล 8 บิต
* ไม่มี parity
* stop bit 1 บิต

นี่มักเป็นค่าเริ่มต้นของ GPS เทเลเมทรี และอุปกรณ์ต่อพ่วงตัวควบคุมการบินส่วนใหญ่ ดังนั้นในทางปฏิบัติจึงแทบไม่จำเป็นต้องแก้ไข

### การใช้งาน UART ในตัวควบคุมการบิน <a href="#uart" id="uart"></a>

ในระบบตัวควบคุมการบินทั่วไป การใช้งาน UART ที่พบบ่อย ได้แก่:

* อินพุตข้อมูลจากโมดูล GPS
* การสื่อสารระหว่างโมดูลเทเลเมทรีกับสถานีควบคุมภาคพื้นดิน
* อินพุตแบบอนุกรมจากตัวรับสัญญาณ เช่น SBUS, CRSF หรือโปรโตคอลตัวรับสัญญาณดิจิทัลอื่น ๆ บางแบบ
* การแลกเปลี่ยนข้อมูลระหว่างคอมพิวเตอร์ร่วมบินกับตัวควบคุมการบิน เช่น MAVLink หรือการสื่อสารด้านการควบคุม/เซนเซอร์อื่น ๆ
* เอาต์พุตคอนโซลดีบักของระบบ สำหรับตรวจสอบข้อความขณะบูต ล็อกข้อผิดพลาด หรือบรรทัดคำสั่งแบบโต้ตอบ

### พอร์ตอนุกรมเชิงตรรกะและ UART ทางกายภาพ <a href="#uart" id="uart"></a>

ในเฟิร์มแวร์ตัวควบคุมการบินกระแสหลักบางตัว ชื่ออย่าง `SERIAL0`, `SERIAL1`, `SERIAL2` ที่ผู้ใช้เห็น มักเป็น**หมายเลขพอร์ตอนุกรมเชิงตรรกะ** ซึ่งไม่จำเป็นต้องตรงกับ UART1, UART2, UART3 บนชิปโดยตรง

ความสัมพันธ์ระหว่าง `SERIALx` กับ UART/USART ทางกายภาพกำหนดโดยไฟล์นิยามฮาร์ดแวร์ ดังนั้นพอร์ตที่ระบุว่า `SERIAL3` เหมือนกัน อาจสอดคล้องกับพอร์ตทางกายภาพที่แตกต่างกันบนตัวควบคุมการบินแต่ละรุ่น

### บทบาทของพอร์ตอนุกรมที่พบบ่อย <a href="#undefined" id="undefined"></a>

บทบาทของพอร์ตอนุกรมที่พบบ่อย ได้แก่ USB พอร์ตเทเลเมทรี พอร์ต GPS และพอร์ตที่ผู้ใช้กำหนดเอง อย่างไรก็ตาม การจับคู่จริงยังขึ้นอยู่กับฮาร์ดแวร์ของบอร์ด

ตัวอย่างเช่น ใน ArduPilot โดยทั่วไป `Serial 0` จะสอดคล้องกับ USB, `Serial 1` และ `Serial 2` มักใช้สำหรับเทเลเมทรี, `Serial 3` และ `Serial 4` มักใช้สำหรับ GPS ส่วนพอร์ตอนุกรมลำดับถัดไปอาจสงวนไว้สำหรับการใช้งานอื่นหรือปิดใช้งานโดยค่าเริ่มต้น

### การกำหนดค่าโปรโตคอล <a href="#undefined" id="undefined"></a>

ในเฟิร์มแวร์ตัวควบคุมการบินที่รองรับการจัดการพอร์ตอนุกรมผ่านพารามิเตอร์ UART หนึ่งชุดไม่ใช่เพียงสายสัญญาณ แต่ยังต้องระบุว่าใช้ส่งโปรโตคอลใด

ตัวอย่างเช่น ใน ArduPilot สามารถตั้งค่า `SERIALx_PROTOCOL` เป็น GPS, MAVLink, RC Input, ESC Telemetry, DisplayPort, Rangefinder, OpticalFlow, DDS XRCE และการใช้งานอื่น ๆ อีกมาก ซึ่งหมายความว่าพอร์ตทางกายภาพเดียวกันสามารถกำหนดให้ใช้กับอุปกรณ์ต่อพ่วงที่แตกต่างกันได้ผ่านพารามิเตอร์

### ตัวเลือกอนุกรมขั้นสูง <a href="#undefined" id="undefined"></a>

ตัวควบคุมการบินบางรุ่นยังมีการตั้งค่า UART ขั้นสูง เช่น การกลับสัญญาณ RX/TX (Invert) ฮาล์ฟดูเพล็กซ์ การสลับ RX/TX การพุลอัป/พุลดาวน์ และการควบคุมพฤติกรรม DMA

ArduPilot รวบรวมฟังก์ชันเหล่านี้ไว้ใน `SERIALx_OPTIONS` และระบุว่าฟังก์ชันบางอย่างรองรับเฉพาะ MCU บางระดับหรือบอร์ดบางรุ่น ดังนั้นก่อนตั้งค่าต้องตรวจสอบความสามารถของฮาร์ดแวร์ก่อน

### ตัวรับสัญญาณและ UART <a href="#uart" id="uart"></a>

โปรโตคอลตัวรับสัญญาณแบบอนุกรมบางแบบสามารถต่อเข้ากับ UART ทั่วไปได้โดยตรง แต่ไม่ใช่ทุกกรณีที่จะเสียบแล้วใช้งานได้ทันที

ตัวอย่างเช่น เอกสาร ArduPilot ระบุว่า UART ใด ๆ ที่รองรับอาจใช้เป็นอินพุต RC ได้ แต่โปรโตคอลอย่าง SBUS, FPort อาจต้องการการกลับสัญญาณ หาก UART ไม่รองรับการกลับสัญญาณ อาจต้องใช้วงจรกลับสัญญาณ (Inverter) แบบฮาร์ดแวร์เพิ่มเติม

### คอนโซลดีบัก <a href="#undefined" id="undefined"></a>

UART ยังเป็นหนึ่งในวิธีที่พบบ่อยในการเข้าถึงคอนโซลดีบักระดับล่างของตัวควบคุมการบิน

ในโหมดนี้ UART สามารถใช้ดูข้อความขณะบูต ข้อผิดพลาดขณะเริ่มต้น สถานะเซนเซอร์ และข้อมูลการวินิจฉัย ดังนั้นเมื่อตัวควบคุมการบินบูตไม่ได้ตามปกติ ระบบไม่สามารถตรวจพบ USB ได้ หรือเฟิร์มแวร์ผิดปกติ UART สำหรับดีบักมักเป็นจุดเริ่มต้นที่สำคัญมากในการแก้ไขปัญหา

### สายสัญญาณและการป้องกันสัญญาณรบกวน <a href="#undefined" id="undefined"></a>

โดยพื้นฐานแล้ว UART ไม่ใช่บัสสำหรับระยะทางไกลหรือทนต่อสัญญาณรบกวนสูง ดังนั้นคุณภาพสายและวิธีการเดินสายจึงมีความสำคัญ

เมื่อใช้อัตราบอดสูง ควรใช้สายให้สั้นที่สุด และใช้การบิดเกลียวสายเพื่อลดสัญญาณรบกวน ตัวอย่างเช่น การเดินสาย TX คู่กับ GND และ RX คู่กับ GND จะเสถียรกว่าการเดินสายขนานแบบหลวม ๆ

### ความเข้ากันได้ของแรงดัน <a href="#undefined" id="undefined"></a>

UART ของ MCU ตัวควบคุมการบินสมัยใหม่ส่วนใหญ่ใช้ระดับแรงดันลอจิก 3.3V ดังนั้นการต่อเข้ากับอุปกรณ์ UART 5V โดยตรงอาจทำให้ไม่เสถียร หรือถึงขั้นทำให้ MCU เสียหายได้

หากอุปกรณ์ต่อพ่วงใช้ระดับแรงดันลอจิก 5V ควรตรวจสอบก่อนว่าเอาต์พุตเข้ากันได้กับ 3.3V หรือไม่ และใส่ตัวแปลงระดับแรงดัน (Level Shifter) เมื่อจำเป็น แทนการต่อเข้าด้วยกันโดยตรง

### ปัญหาที่พบบ่อย <a href="#undefined" id="undefined"></a>

ต่อไปนี้คือสาเหตุของปัญหา UART ที่พบบ่อยที่สุด:

* **ต่อ TX / RX สลับกัน**: พบบ่อยที่สุด และควรตรวจสอบเป็นอันดับแรก
* อัตราบอด**ไม่ตรงกัน**: อาการที่พบบ่อยคืออักขระขยะหรือไม่มีข้อมูลเลย
* **ไม่มีกราวดร่วม**: ดูเหมือนต่อสายทั้งสองฝั่งเรียบร้อยแล้ว แต่สัญญาณไม่สามารถอ่านได้อย่างถูกต้อง
* **แรงดันไม่เข้ากัน**: การต่อลอจิก 3.3V กับ 5V ปะปนกันอาจทำให้ล้มเหลวหรือเสียหาย
* **สายยาวเกินไปหรือเดินสายไม่ดี**: เกิดปัญหาได้ง่ายเป็นพิเศษเมื่อใช้อัตราบอดสูง มีสัญญาณรบกวนจากมอเตอร์ หรือในสภาพแวดล้อมที่มีการสั่นสะเทือน
* **พอร์ตอนุกรมถูกฟังก์ชันอื่นใช้อยู่แล้ว**: ต่อพอร์ตทางกายภาพถูกต้องแล้ว แต่พารามิเตอร์เฟิร์มแวร์กำหนดพอร์ตนั้นให้กับโปรโตคอลอื่น

### ลำดับการแก้ไขปัญหาที่แนะนำ <a href="#undefined" id="undefined"></a>

หากการสื่อสาร UART ผิดปกติ แนะนำให้ตรวจสอบรายการต่อไปนี้ตามลำดับ:

1. ตรวจสอบว่า TX ต่อกับ RX, RX ต่อกับ TX และ GND ต่อกับ GND
2. ตรวจสอบว่าอัตราบอดทั้งสองฝั่งตรงกัน
3. ตรวจสอบว่ารูปแบบข้อมูลเป็นไปตามที่คาดหวัง โดยทั่วไปคือ 8N1
4. ตรวจสอบว่าพอร์ตทางกายภาพนั้นถูกกำหนดโปรโตคอลที่ถูกต้องในเฟิร์มแวร์
5. ตรวจสอบว่าระดับแรงดันลอจิกของอุปกรณ์ต่อพ่วงเข้ากันได้กับตัวควบคุมการบินหรือไม่
6. ตรวจสอบว่าความยาวสาย จุดบัดกรี และขั้วต่อมั่นคงหรือไม่
7. หากจำเป็น ให้ใช้ออสซิลโลสโคปหรือเครื่องมือ USB-UART สังเกตสัญญาณ TX/RX โดยตรง

### ข้อควรระวัง <a href="#undefined" id="undefined"></a>

**ข้อควรระวัง:** UART ไม่ใช่บัสที่ใช้ร่วมกันแบบหลายจุด TX/RX หนึ่งชุดโดยทั่วไปควรต่อกับอุปกรณ์ที่สอดคล้องกันเพียงตัวเดียว เว้นแต่ท่านจะทราบดีว่าโปรโตคอลและสถาปัตยกรรมฮาร์ดแวร์นั้นอนุญาตให้ต่อแบบพิเศษได้

**ข้อควรระวัง:** ตัวควบคุมการบินแต่ละรุ่นอาจจับคู่ชื่อ "GPS", "TELEM1", "UART4", "SERIAL3" แตกต่างกัน ก่อนต่อสายควรเทียบทั้งตารางผังขาฮาร์ดแวร์และการกำหนดค่าพารามิเตอร์เฟิร์มแวร์

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