Truyền thông nối tiếp trong lập trình vi điều khiển – Giao tiếp UART

    Các máy tính/vi điều khiển thường truyền tín hiệu theo hai cách: Song song và nối tiếp. Trong kênh truyền song song, khi truyền một gói dữ liệu n-bit thì ta cần n đường truyền, mỗi bit trong gói dữ liệu sẽ đi trên một đường truyền. Trong kênh truyền nối tiếp, ta chỉ cần một đường truyền để truyền tuần tự n bit của gói dữ liệu. Như vậy, để truyền một gói dữ liệu trong kênh truyền song song ta tốn một khoản thời gian tbit, trong kênh truyền nối tiếp để truyền n bit ta tốn khoản thời gian n*tbit :

Các loại kênh truyền dữ liệu nối tiếp:

Các kênh truyền được gọi là simplex (đơn công), hay half duplex(bán song công), hay full duplex (song công) tùy thuộc vào kiểu mà mình kết nối.
   – Kênh truyền nối tiếp simplex chỉ truyền được theo một hướng duy nhất trên một đường truyền xác định.

   – Kênh truyền nối tiếp half –duplex chỉ có một trường truyền nhưng dữ liệu có thể truyền theo 2 hướng, tuy nhiên trong một lúc, dữ liệu chỉ đi được theo 1 hướng.

   – Kênh truyền nối tiếp full – duplex có 2 đường truyền dữ liệu riêng biệt, một đường truyền và một đường nhận, cho phép dữ liệu truyền nhận theo 2 hướng cùng lúc.

Đồng bộ dữ liệu trong các kênh truyền nối tiếp

   – Tất cả các kênh truyền nối tiếp đều yêu cầu tín hiệu clock nhằm thiết lập tốc độ tín hiệu truyền nhận dữ liệu giữa các bên cho khớp với nhau. Tùy thuộc vào vào cách sử dụng tín hiệu clock như thế nào mà chúng ta có định nghĩa về kênh truyền đồng bộ hay kênh truyền không đồng bộ.
  – Kênh truyền không đồng bộ sử dụng bộ tạo tín hiệu clock độc lập ở mỗi thiết bị, dữ liệu được truyền theo một khung truyền và tốc độ baud được thống nhất bởi bên truyền và bên nhận.  Còn đối với kênh truyền đồng bộ sẽ có những tín hiệu clock được truyền đồng thời với dữ liệu trên một đường truyền nối giữa hai thiết bị.
Khung truyền và một số khái niệm, thuật ngữ
Khung truyền dữ liệu (data frame)
   – Dữ liệu đi vào ở đầu thu của đường dữ liệu trong truyền dữ liệu nối tiếp là một dãy các số 0 và 1, và rất khó để hiểu được ý nghĩa của các dữ liệu ấy nếu bên phát và bên thu không cùng thống nhất về một tập các luật, một thủ tục, về cách dữ liệu được đóng gói, bao nhiêu bit tạo nên một ký tự và khi nào dữ liệu bắt đầu và kết thúc. Bên cạnh tốc độ baud, khung truyền là một yếu tố quan trọng tạo nên sự thành công khi truyền và nhận. Khung truyền bao gồm các quy định về số bit trong mỗi lần truyền, các bit “báo” như bit Start và bit Stop, các bit kiểm tra như Parity, ngoài ra số lượng các bit trong một data hay thứ tự truyền các bit trên đường truyền cũng được quy định bởi khung truyền. Hình ảnh cấu trúc dữ liệu trong truyền thông nối tiếp bất đồng bộ:

   – Start là bit đầu tiên được truyền trong một frame truyền, bit này có chức năng báo cho thiết bị nhận biết rằng có một gói dữ liệu sắp được truyền tới. Start là bit bắt buộcphải có trong khung truyền, và nó là một bit thấp (0).
   – Data hay dữ liệu cần truyền là thông tin chính mà chúng ta cần gởi và nhận. Số lượng bit data tùy thuộc vào các loại vi điều khiển khác nhau, thường thì data có 8bit. Trong truyền thông nối tiếp UART, bit có trọng số nhỏ nhất (LSB – Least Significant Bit, bit bên phải) của data sẽ được truyền trước và cuối cùng là bit có trọng số lớn nhất (MSB – Most Significant Bit, bit bên trái). Tuy nhiên thứ tự truyền này có thể được cài đặt bởi người dùng.
  – Parity là bit dùng để kiểm tra dữ liệu truyền có đúng không (một cách tương đối). Có 2 loại parity là parity chẵn (even parity) và parity lẻ (odd parity). Parity chẵn nghĩa là số lượng số “1” trong dữ liệu bao gồm bit parity luôn là số chẵn. Ngược lại tổng số lượng các số “1” trong parity lẻ luôn là số lẻ.
   Thí dụ: nếu dữ liệu của bạn là 10111011 nhị phân, có tất cả 6 bit có giá trị “1” trong dữ liệu này, nếu quy định parity chẵn được dùng, bit parity sẽ mang giá trị 0 để đảm bảo tổng các số “1” là số chẵn (6 số 1). Nếu parity lẻ được yêu cầu thì giá trị của parity bit là 1. Sau khi truyền chuỗi dữ liệu kèm theo cả bit parity trên, bên nhận thu được và kiểm tra lại tổng số số “1” (bao gồm cả bit parity), nếu vi phạm quy định parity đã đặt trước thì ta khẳng định là dữ liệu nhận được là sai, còn nếu không vi phạm thì cũng không khẳng định được điều gì (mang tính tương đối).
Parity bit không phải là bit bắt buộc và vì thế chúng ta có thể loại bit này khỏi khung truyền.
  – Stop bits là 01 hoặc nhiều bit báo cho thiết bị nhận rằng một gói dữ liệu đã được gởi xong. Sau khi nhận được stop bits, thiết bị nhận sẽ tiến hành kiểm tra khung truyền để đảm bảo tính chính xác của dữ liệu. Stop bits là các bit bắt buộc xuất hiện trong khung truyền.
Ví dụ về gói dữ liệu 0x7B với lựa chọn kiểm tra bít chẵn:

Tốc độ bit và tốc độ baud
   – Có hai thuật ngữ thường dùng trong truyền số liệu là tốc độ bit (bit rate) và tốc độ baud (baud rate) thường bị nhầm lẫn. Tốc độ bit là số bit được truyền trong một giây, Tốc độ baud là số đơn vị tín hiệu trong một giây cần có để biểu diễn số bit vừa nêu. Khi nói về hiệu quả của máy tính, thì tốc độ bit luôn là yếu tố quan trọng. Tuy nhiên, trong truyền số liệu ta lại cần quan tâm đến hiệu quả truyền dẫn dữ liệu từ nơi này đến nơi khác, như thế khi dùng ít đơn vị tín hiệu cần có, thì hiệu quả càng cao, và băng thông truyền càng thấp; như thế thì cần chú ý đến tốc độ baud. Tốc độ baud xác định băng thông cần thiết để truyền tín hiệu.Tốc độ bit là tốc độ baud nhân với số bit trong mỗi đơn vị tín hiệu. Tốc độ baud schia cho số bit biểu diễn trong mỗi đơn vị truyền.
   Tốc độ bit là số bit trong mỗi giây.
   Tốc độ baud là số đơn vị tín hiệu trong mỗi giây.
   Tốc độ baud thường bé hơn hay bằng tốc độ bit.
– Một ý niệm tương đồng có thể giúp hiểu rõ vấn đề này; baud tương tư như xe khách, còn bit tương tự như số hành khách. Một chuyến xe mang một hoặc nhiều hành khách. Nếu 1000 xe di chuyển từ điểm này sang điểm khác chỉ mang một hành khách (thí dụ lái xe) thì mang được 1000 hành khách. Tuy nhiên, với số xe này, mỗi xe mang 4 người, thì ta vận chuyển được 4000 hành khách. Chú ý là chính số xe, chứ không phải số hành khách, là đơn vị lưu thông trên đường, tức là tạo nhu cầu về độ rộng của xa lộ. Nói cách khác, tốc độ baud xác định băng thông cần thiết, chứ không phải số bit.
Thí dụ 1:
Một tín hiệu analog mang 4 bit trong mỗi phần tử tín hiệu. Nếu 1000 phần tử tín hiệu được gởi trong một giây, xác định tốc độ baud và tốc độ bit.
Giải:
Tốc độ baud = số đơn vị tín hiệu = 1000 baud/giây
Tốc độ bit = tốc độ baud x số bit trong một  đơn vị tín hiệu =1000 x 4 = 4000 bps.
Thí dụ 2:
Tốc độ bit của tín hiệu là 3000. Nếu mỗi phần tử tín hiệu mang 6 bit, cho biết tốc độ baud?
Giải:
Tốc độ baud = tốc độ bit/ số bit trong mỗi phần tử tín hiệu = 3000/6 =500 baud/giây
Nhật Thương