Truyền thông nối tiếp

Trong viễn thông và truyền dữ liệu, **truyền thông nối tiếp** (tiếng Anh: **serial communication**) là quá trình gửi dữ liệu tuần tự theo từng bit, qua một kênh truyền thông (communication channel) hoặc bus máy tính. Quá trình truyền thông nối tiếp trái ngược với truyền thông song song (parallel communication), trong đó một số bit được gửi toàn bộ và cùng lúc, trên một đường truyền hoặc liên kết (link hoặc communication link) gồm nhiều kênh song song.

Truyền thông nối tiếp được sử dụng cho tất cả truyền thông đường dài (long-haul communication) và trong hầu hết các mạng máy tính, nơi mà chi phí cáp và những khó khăn trong việc đồng bộ hóa dữ liệu khiến truyền thông song song không thực tế và hiệu quả. Các bus máy tính nối tiếp đang ngày càng trở nên phổ biến hơn, ngay cả ở khoảng cách ngắn, vì những cải tiến trong việc đảm bảo tính toàn vẹn tín hiệu. Tốc độ truyền trong các công nghệ truyền thông nối tiếp mới đã bắt đầu vượt xa ưu thế trước đó của truyền thông song song ở tính đơn giản (không cần serializer và deserializer, được gọi là SerDes ở truyền thông song song) và khắc phục được các nhược điểm của nó như lệch xung clock (clock skew) hay mật độ kết nối. Việc chuyển đổi từ PCI sang PCI Express là một ví dụ.

## Truyền thông đồng bộ và bất đồng bộ
Trên thực tế, việc truyền thông nối tiếp không chỉ đơn thuần sử dụng một dây duy nhất để truyền tín hiệu mà cần thêm một vài cơ chế hỗ trợ khác để đảm bảo tính toàn vẹn và chính xác của dữ liệu truyền đi, đó là lí do mà phương pháp **truyền thông nối tiếp đồng bộ** và **bất đồng bộ** ra đời. Truyền thông nối tiếp đồng bộ (*synchronous transmission*) đòi hỏi giữa phía truyền (sender) và phía nhận (receiver) phải được đồng bộ bởi tín hiệu xung clock. Các giao thức sử dụng phương pháp này có thể kể đến như I²C, SPI, RS-232, FireWire, Ethernet, USB,... Khác với truyền thông đồng bộ, truyền thông bất đồng bộ (a*synchronous transmission*) không sử dụng xung clock để đồng bộ mà sử dụng bit start và bit stop cho việc bắt đầu và kết thúc quá trình truyền dữ liệu, đồng thời dùng bit chẵn (parity bit) để đảm bảo tính toàn vẹn dữ liệu, và những quy ước thuộc về phần cứng giữa 2 phía truyền-nhận. Ví dụ, phía truyền quy định cứ mỗi 1 mili giây sẽ gởi 1 bit dữ liệu và phía nhận cũng quy định là cứ 1 mili giây sẽ nhận 1 bit dữ liệu. Khi đó giữa phía truyền - nhận đã có thống nhất với nhau về tốc độ truyền nhận dữ liệu và đã có thể truyền nhận dữ liệu với nhau.

Với truyền thông đồng bộ, quá trình truyền dữ liệu phải được thực thi trên cả phần cứng và phần mềm. Ví dụ như giao thức I²C (về phần cứng) đòi hỏi 2 dây cho quá trình truyền dữ liệu là SCL (cho việc đồng bộ xung clock) và dây SDA (cho việc gởi dữ liệu). Bên cạnh đó, để giao tiếp được giữa thiết bị master với các slave trong hệ thống I²C thì các slave phải có địa chỉ cụ thể (địa chỉ của thiết bị I²C được quy định bởi nhà sản xuất), các chương trình phần mềm để giao tiếp được giữa thiết bị master-slave trong hệ thống I²C từ đó phải định rõ địa chỉ của thiết bị cần giao tiếp.

Với truyền thông bất đồng bộ, quá trình truyền dữ liệu được thực thi chỉ trên phần cứng. Một bộ phận phần cứng phổ biến trong các dòng vi điều khiển hỗ trợ truyền thông bất đồng bộ là UART (Universal Asynchronous Receiver-Transmitter).

## Cáp
Nhiều hệ thống truyền thông nối tiếp ban đầu được thiết kế để truyền dữ liệu qua khoảng cách tương đối lớn thông qua một số loại cáp dữ liệu.

Trên thực tế, tất cả các giao tiếp đường dài truyền dữ liệu một bit tại một thời điểm vì việc này sẽ làm giảm chi phí của cáp (chỉ dùng một cáp cho việc truyền dữ liệu), trong khi đó quá trình truyền thông song song sẽ truyền song song nhiều bit cùng lúc như. Các cáp mang dữ liệu này (trừ "cáp nối tiếp") và các cổng máy tính (mà chúng cắm vào) thường được gọi bằng một tên cụ thể hơn, để giảm sự nhầm lẫn.

Bàn phím và chuột máy tính gần như luôn luôn sử dụng truyền thông nối tiếp, như cổng PS/2, Apple Desktop Bus và cổng USB.

Các cáp mang tín hiệu video kỹ thuật số cũng gần như luôn sử dụng truyền thông nối tiếp như Cáp đồng trục được cắm vào cổng HD-SDI, webcam cắm vào cổng USB hoặc cổng Firewire, cáp Ethernet kết nối camera IP với cổng POE (Power over Ethernet), FPD-Link,...

Các loại cáp và cổng khác cũng truyền dữ liệu từng bit một, bao gồm Serial ATA, Serial SCSI, cáp Ethernet được cắm vào cổng Ethernet, kênh dữ liệu hiển thị (DDC: Display Data Channel) sử dụng các chân được dành riêng trước đó của đầu nối VGA hoặc cổng DVI hoặc cổng HDMI.

## Bus nối tiếp

Nhiều hệ thống truyền thông thường được thiết kế để kết nối hai mạch tích hợp (IC) trên cùng một board mạch in thông qua các đường dây tín hiệu trên board mạch đó (chứ không sử dụng cáp rời bên ngoài).

IC thường đắt hơn khi chúng có nhiều chân hơn. Để giảm số lượng chân trong một gói (package), nhiều IC sử dụng một bus nối tiếp để truyền dữ liệu khi tốc độ truyền không phải là ưu tiên hàng đầu. Một số ví dụ về bus nối tiếp chi phí thấp bao gồm RS-232, SPI, I²C, DC-BUS, UNI/O, 1-Wire và PCI Express. Trong IC, các bus nối tiếp có thể được thực hiện bằng cách sử dụng bộ ghép kênh (multiplexer), với phương pháp ghép kênh.

## So sánh với truyền thông song song
Quá trình truyền thông giữa các máy tính với nhau hoặc với thiết bị, có thể thực hiện thông qua truyền thông nối tiếp hoặc song song. Một liên kết song song truyền một số luồng dữ liệu đồng thời dọc theo nhiều kênh (ví dụ: dây, đường mạch in hoặc sợi quang); trong khi đó, một liên kết nối tiếp chỉ truyền một luồng dữ liệu duy nhất.

Mặc dù một liên kết nối tiếp có vẻ kém hơn so với liên kết song song, vì nó có thể truyền ít dữ liệu hơn trên mỗi chu kỳ xung clock của vi điều khiển, nhưng thường thì các liên kết nối tiếp có thể được chạy nhanh hơn một cách đáng kể để đạt được tốc độ dữ liệu cao hơn so với liên kết song song. Một số yếu tố cho phép truyền thông nối tiếp có thể hoạt động được ở xung clock tần số cao như:

* Lệch xung clock giữa các kênh khác nhau không phải là vấn đề (đối với các liên kết truyền thông nối tiếp bất đồng bộ - asynchronous serial communication không cần xung clock).
* Một kết nối trong truyền thông nối tiếp đòi hỏi ít dây kết nối hơn và do đó chiếm ít không gian hơn. Từ đó, không gian tiết kiệm được cho phép cách ly kênh tốt hơn với môi trường xung quanh. 
* Hiện tượng nhiễu tín hiệu đường truyền (crosstalk) ít ảnh hưởng hơn, vì có ít dây dẫn ở gần nhau.

Trong nhiều trường hợp, quá trình truyền thông nối tiếp sẽ tiết kiệm hơn truyền thông song song. Nhiều IC ngày nay hỗ trợ truyền thông nối tiếp, đồng nghĩa với việc chúng có ít chân hơn, do đó chi phí sẽ thấp hơn.

## Các giao thức truyền thông nối tiếp

*ARINC 818 Avionics Digital Video Bus
*Atari SIO (Atari SIO, nền tảng của USB, công trình của Joe Decuir)
*CAN: Control Area Network Vehicle Bus
*ccTalk: Ứng dụng trong giao dịch và công nghiệp point-to-sale 
*CoaXPress: giao thức camera công nghiệp trên cáp đồng trục
*DC-BUS: giao tiếp thông qua dây nguồn DC.
*DMX512: chuẩn truyền để điều khiển hệ thống chiếu sáng của  sân khấu
*Ethernet
*Fibre Channel: chuẩn truyển Serial tốc độ cao, kết nối máy tính đến các thiết bị lưu trữ.
*FireWire
*HyperTransport
*InfiniBand: (tốc độ rất cao, tương đương với tốc độ của PCI)
*I²C
*MIDI: điều khiển các nhạc cụ điện tử
*MIL-STD-1553A/B
*Morse code telegraphy
*PCI Express
*Profibus
*RS-232
*RS-422 
*RS-423
*RS-485 
*SDI-12: giao thức cảm biến công nghiệp
*Serial ATA
*Serial Attached SCSI
*SONET và SDH (giao thức viễn thông tốc độ cao trên cáp quang)
*SpaceWire: giao tiếp của mạng Spacecraft
*SPI
*T-1, E-1 và một số chuẩn khác (giao thức viễn thông tốc độ cao trên cáp đồng)
*USB: chuẩn truyền hỗ trợ kết nối thiết bị ngoại vi đến máy tính
*UNI/O
*1-Wire

## Xem thêm

*UART
*Cổng nối tiếp
*8N1 (chế độ truyền trong truyền thông nối tiếp)
*Bus (máy tính)
* Truyền dữ liệu 
*Tiêu chuẩn liên bang 1037C
* Kiểm soát liên kết dữ liệu cấp cao (HDLC) 
* Bus giao diện ngoại vi nối tiếp 

## Tham khảo

## Liên kết ngoài

* Hướng dẫn giao diện nối tiếp cho Robotics (chứa nhiều ví dụ thực tế) 
* Danh sách giao diện nối tiếp (có sơ đồ chân) 
* Serial ports, c2.com
* Visual studio 2008 mã hóa cho truyền thông nối tiếp 
* Giới thiệu về giao thức I²C và SPI  
* Giới thiệu truyền thông nối tiếp 
* Serial Port Programming in Linux