Penanganan Kesalahan UART

8

Saya tidak berkonsentrasi pada MCU spesifik karena UART dari sebagian besar pengontrol memiliki arsitektur yang sama. Mereka memiliki FIFO untuk Tx dan Rx.

Kesalahan paling umum yang dihasilkan oleh UART adalah: - 1. Kesalahan Pembingkaian 2. Kesalahan Paritas 3. Kesalahan Berlangsung (Overflow dari FIFO Tx / Rx) 4. Terima Kesalahan Break (Beberapa Kesalahan dengan Stop Bits)

Bagaimana seseorang harus menangani Kondisi Kesalahan ini untuk menjaga komunikasi dengan benar?

Saya mengerti itu adalah pertanyaan yang tidak jelas, tetapi sebagian besar waktu orang menjadi bingung tentang apa yang harus dilakukan ketika kesalahan tersebut terjadi dan berakhir hanya dengan menghapus bit kesalahan.

Swanand
sumber

Jawaban:

6

Untuk benar-benar menjawab pertanyaan Anda, saya biasanya membuang apa pun yang diterima dengan kesalahan. Itu mungkin termasuk menginisialisasi ulang perangkat keras UART, tergantung pada kesalahan apa itu dan rincian perangkat keras UART.

Satu-satunya pengecualian adalah jika Anda ingin menerima istirahat dengan sengaja. Itu muncul sebagai kesalahan pembingkaian. Jika demikian, Anda meneruskan kesalahan pembingkaian ke tingkat yang lebih tinggi sebagai kondisi khusus. Namun, itu membutuhkan informasi dari band untuk diteruskan ke tingkat yang lebih tinggi dan oleh karena itu antarmuka penerima UART tidak dapat dilihat sebagai sesuatu yang sangat sederhana seperti mendapatkan aliran byte. Saya pikir saya telah melakukan ini tepat sekali di banyak proyek mikrokontroler karena itu harus kompatibel dengan sistem lama di mana istirahat digunakan dengan sengaja.

Steven telah memberi Anda beberapa ide bagus apa yang harus dilakukan tentang ini di tingkat yang lebih tinggi. Ketika Anda berpikir ada peluang nyata kesalahan dan integritas data penting, maka Anda biasanya merangkum potongan data ke dalam paket dengan checksum. Penerima mengirim ACK untuk setiap checksum yang diterima dengan benar.

Namun, sebagian besar waktu kesalahan UART sangat tidak mungkin dan tidak sepenuhnya kritis sehingga Anda bisa mengabaikannya di tingkat tinggi. Jenis kesalahan yang dapat ditangkap oleh perangkat keras UART biasanya karena kebodohan operator, bukan derau saluran. Kebanyakan noise akan menyebabkan data buruk, yang tidak akan terdeteksi oleh UART. Jadi pengandar UART tingkat rendah membuang sesuatu yang langsung terkait dengan kesalahan UART, tetapi jika tidak terus meneruskan aliran byte yang diterima hingga ke tingkat berikutnya. Bahkan ia melakukan ini bahkan jika Anda menggunakan paket dan checksum karena itu dilakukan pada tingkat yang lebih tinggi daripada ketika masing-masing byte diterima.

Olin Lathrop
sumber
9

Kesalahan ini tidak dapat diperbaiki, sehingga pengiriman ulang diperlukan. Ini membutuhkan beberapa protokol di tingkat yang lebih tinggi daripada UART; Anda biasanya ingin mengakui penerimaan yang benar dari paket data. Paket ini mungkin 1 byte, tetapi juga paket yang lebih panjang dapat digunakan jika komunikasi memiliki sedikit kesalahan. Akui setiap paket dengan mengirim ACK ke pemancar, NACK jika ada kesalahan. Dalam kasus terakhir, buang paket dan tunggu pengiriman ulang.
Jika Anda menggunakan transfer paket, Anda mungkin ingin mempertimbangkan pengecekan kesalahan CRC alih-alih paritas, yang tidak terlalu efisien (menambahkan 1 bit per byte) dan hanya menangkap kesalahan bit tunggal.

stevenvh
sumber
3

Ketika ada kesalahan pembingkaian dalam data UART yang diterima, peluangnya bagus bahwa semua byte yang berhasil akan menjadi sampah sampai, tergantung pada UART, ada sepuluh atau lebih bit kali antara tepi jatuh berturut-turut pada kabel data, sembilan belas bit kali spasi berturut-turut, atau sembilan kali penandaan berurutan (yang terakhir akan bekerja pada semua UART). Jika seseorang menerima byte yang dibingkai dengan benar dengan nilai 0x00 atau 0x80 (0x100 dalam mode 9-bit) dan baik pemancar tidak mengirim istirahat panjang atau penerima akan berhenti mencoba mengurai byte dari istirahat panjang yang dikirim pemancar, satu dapat yakinlah bahwa itu benar dan byte yang berhasil akan benar juga. Jika seseorang menerima nilai di mana ada 0-6 "nol" berturut-turut di bit yang lebih rendah, dan bit yang tersisa semuanya diatur,

S = MULAI P = data byte yang berlaku s = berhenti D = byte saat ini - = idle
0111111101000000011111 - Sinyal on line
Ps ------ SDDDDDDDD ---: Seperti yang dimaksudkan oleh pemancar (0x02)
SPPPPPPPPsSDDDDDDDDs-: Seperti yang diterima (0xC0)

Jika setiap paket dimulai dengan 0x00 dan diikuti oleh 0xFF, kesalahan pembingkaian pada satu paket tidak akan mempengaruhi paket berikutnya. Ketika penerima mengetahui kesalahan pembingkaian, ia dapat mulai membuang data hingga melihat 0x00 yang dibingkai dengan benar, sehingga penerima akan tahu bahwa ia memiliki permulaan paket yang sah.

supercat
sumber