Xử lý lỗi UART


8

Tôi không tập trung vào một MCU cụ thể vì UART của hầu hết các bộ điều khiển có kiến ​​trúc tương tự. Họ có FIFO cho cả Tx và Rx.

Các lỗi phổ biến nhất do UART tạo ra là: - 1. Lỗi khung 2. Lỗi chẵn lẻ 3. Lỗi chạy quá mức (Lỗi tràn Tx / Rx FIFO) 4. Lỗi nhận lỗi (Một số lỗi khi dừng bit)

Làm thế nào một người nên xử lý các Điều kiện lỗi này để duy trì giao tiếp đúng cách?

Tôi hiểu đó là một câu hỏi mơ hồ nhưng hầu hết mọi người thường bối rối về những gì người ta nên làm khi xảy ra lỗi như vậy và cuối cùng chỉ xóa các bit lỗi.

Câu trả lời:


6

Để thực sự trả lời câu hỏi của bạn, tôi thường loại bỏ bất cứ thứ gì nhận được có lỗi. Điều đó có thể bao gồm khởi tạo lại phần cứng UART, tùy thuộc vào lỗi đó và chi tiết của phần cứng UART.

Ngoại lệ duy nhất là nếu bạn muốn cố tình nhận được nghỉ. Những người hiển thị như là lỗi khung. Trong trường hợp đó, bạn chuyển các lỗi định khung lên đến các mức cao hơn như các điều kiện đặc biệt. Tuy nhiên, điều đó đòi hỏi thông tin ngoài băng phải được chuyển đến các cấp cao hơn và do đó giao diện máy thu UART không thể được xem là một thứ khá đơn giản như nhận được một luồng byte. Tôi nghĩ rằng tôi đã thực hiện điều này chính xác một lần trong nhiều dự án vi điều khiển bởi vì nó phải tương thích với một hệ thống cũ, nơi các ngắt được sử dụng có chủ ý.

Steven đã cho bạn một số ý tưởng tốt để làm gì về điều này ở cấp độ cao hơn. Khi bạn nghĩ rằng có khả năng thực sự xảy ra lỗi và tính toàn vẹn dữ liệu là quan trọng, thì bạn thường đóng gói các khối dữ liệu vào các gói bằng tổng kiểm tra. Người nhận sẽ gửi một ACK cho mỗi tổng kiểm tra nhận được chính xác.

Tuy nhiên, phần lớn các lỗi UART rất khó xảy ra và không hoàn toàn nghiêm trọng đến mức bạn có thể bỏ qua chúng ở cấp độ cao. Các loại lỗi mà phần cứng UART có thể mắc phải thường là do sự ngu ngốc của người vận hành, không phải do nhiễu đường truyền. Giống như tiếng ồn sẽ gây ra dữ liệu xấu, mà UART sẽ không phát hiện ra. Vì vậy, trình điều khiển UART mức thấp sẽ loại bỏ bất cứ thứ gì ngay lập tức liên quan đến lỗi UART, nhưng nếu không thì tiếp tục truyền luồng byte nhận được lên cấp độ tiếp theo. Trong thực tế, nó thực hiện điều này ngay cả khi bạn đang sử dụng các gói và tổng kiểm tra vì việc đó được thực hiện ở mức cao hơn so với nơi nhận từng byte riêng lẻ.


9

Những lỗi này không thể sửa được, vì vậy cần truyền lại. Điều này cần một số giao thức ở mức cao hơn UART; thông thường bạn sẽ muốn thừa nhận việc nhận chính xác một gói dữ liệu. Gói này có thể là 1 byte, nhưng cũng có thể sử dụng các gói dài hơn nếu giao tiếp có ít lỗi. Xác nhận từng gói bằng cách gửi ACK đến máy phát, NACK nếu xảy ra lỗi. Trong trường hợp sau, loại bỏ gói và chờ truyền lại.
Nếu bạn sử dụng chuyển gói, bạn có thể muốn xem xét kiểm tra lỗi CRC thay vì chẵn lẻ, điều này không hiệu quả (thêm 1 bit cho mỗi byte) và chỉ bắt lỗi một bit.


3

Khi có lỗi định khung trong dữ liệu UART nhận được, tỷ lệ cược là tất cả các byte thành công sẽ là rác cho đến khi, tùy thuộc vào UART, có mười hoặc nhiều lần bit giữa các cạnh rơi liên tiếp trên dây dữ liệu, mười chín lần bit khoảng cách liên tiếp, hoặc chín bit lần đánh dấu liên tiếp (lần cuối cùng trong số đó sẽ hoạt động trên tất cả các UART). Nếu một người nhận được một byte có khung chính xác với giá trị 0x00 hoặc 0x80 (0x100 ở chế độ 9 bit) và máy phát không gửi các khoảng nghỉ dài hoặc máy thu sẽ ngừng cố gắng phân tích các byte ra khỏi bất kỳ ngắt nào mà máy phát gửi đi, người ta có thể được đảm bảo rằng nó là chính xác và byte thành công cũng sẽ chính xác. Nếu một người nhận được một giá trị trong đó có 0-6 "số 0" liên tiếp ở các bit thấp hơn và các bit còn lại đều được đặt,

S = START P = dữ liệu byte trước s = stop D = byte hiện tại - = idle
0111111101000000011111 - Tín hiệu trực tuyến
Ps ------ SDDĐDDDDDs ---: Theo dự định của máy phát (0x02)
SPPPPPPPPsSDDDDDDDDs-: Như đã nhận (0xC0)

Nếu mỗi gói bắt đầu bằng 0x00 và được theo sau bởi 0xFF, lỗi đóng khung trên một gói sẽ không ảnh hưởng đến gói tiếp theo. Khi người nhận nhận thấy lỗi định khung, nó có thể bắt đầu loại bỏ dữ liệu cho đến khi thấy 0x00 được đóng khung đúng, khi đó nó sẽ biết rằng nó có một gói bắt đầu hợp pháp.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.