Ada beberapa sumber potensial untuk kebisingan di sirkuit apa pun. Beberapa yang paling umum termasuk:
- Catu daya yang tidak diatur dengan baik;
- Berpindah catu daya;
- Decoupling kapasitif yang tidak memadai dari rel daya di dekat MCU;
- Kopling induktif dari sumber elektromagnetik terdekat (termasuk 50 atau 60Hz dari daya listrik; bahkan jika rangkaian bertenaga baterai, ia akan mengalami gangguan ini ketika cukup dekat dengan sumber listrik);
- Sumber RF dekat frekuensi resonansi jejak pada papan sirkuit, atau salah satu harmoniknya;
- Routing dari jejak arus tinggi pada papan sirkuit di dekat garis sinyal;
- Dll
Selain itu (seperti yang disebutkan @jippie), kemiringan jam merupakan penyebab paling umum kesalahan dalam semua jenis komunikasi serial yang menggunakan laju data yang telah ditentukan. Jika Anda menggunakan kristal eksternal dan interfacing ke sistem lain yang secara wajar dapat diharapkan akurat, kecil kemungkinannya menyebabkan masalah. Osilator internal, bagaimanapun, dapat memiliki toleransi yang beberapa urutan besarnya lebih buruk daripada kristal, dan cenderung lebih bervariasi pada rentang suhu.
Ada beberapa tes dasar yang dapat dilakukan pada sistem yang sedang berjalan untuk menentukan kekebalan dasar kebisingan (dan kemiringan) antarmuka Anda, termasuk:
- Pembekuan (mendinginkan sirkuit ke peringkat minimum komponennya);
- Baking (panaskan ke peringkat maksimum);
- Paparan EMI :
- Tempatkan papan di atas kabel daya pemanas ruang berlari;
- Kunci radio CB di dekat papan;
- Letakkan papan di sebelah router nirkabel Anda;
- Gunakan kabel hookup panjang (bukan kabel serial yang dibangun dengan benar) untuk koneksi UART.
Ada banyak lainnya - pada kenyataannya, ada laboratorium pengujian besar yang didedikasikan untuk kualifikasi EMC .
Secara umum, kecuali beberapa tingkat minimal kehilangan data dapat diterima, selalu bijaksana untuk memasukkan semacam pemeriksaan kesalahan dalam kode komunikasi Anda. Bahkan checksum sederhana lebih baik daripada tidak sama sekali.
Sebagian besar kesalahan berasal dari tiga penyebab: (1) sinyal yang dihasilkan pemancar tidak mewakili data yang valid; (2) sinyal pemancar tidak diterima sebagai yang dihasilkan, atau (3) penerima tidak siap untuk menangani data ketika diterima. Penyebab paling umum yang pernah saya lihat untuk masalah # 1 adalah pemancar yang akan dikonfigurasi ulang atau dimatikan saat sedang mentransmisikan data. Masalah # 2 dapat dengan mudah terjadi untuk sinyal yang bepergian melalui "dunia luar" sebagai akibat dari hal-hal seperti gangguan radio (ponsel bisa sangat buruk!), Tetapi umumnya tidak terjadi untuk sinyal yang terbatas pada papan tunggal. Masalah # 3 dapat terjadi karena terlalu banyak byte yang datang lebih cepat daripada yang dapat diproses, atau karena penerima dikonfigurasi ulang, dimatikan, atau dijalankan saat transmisi.
Dalam banyak kasus, sulit untuk sepenuhnya menghilangkan semua masalah ini; Tujuan seseorang harus memastikan bahwa "kerusakan" total yang dilakukan oleh mereka (probabilitas terjadinya, kali kerusakan per kejadian) dapat diterima rendah. Ini paling mudah dapat dilakukan dengan memilih perkiraan keandalan yang pesimistis, dan kemudian merancang protokol sehingga dampak pada kinerja sistem bahkan dari kegagalan terburuk yang konsisten dengan perkiraan seseorang akan berada dalam batas yang dapat diterima.
sumber
Kesalahan pembingkaian dapat disebabkan oleh apa yang disebutkan oleh @ jippie - penerima telah mendeteksi bit awal dan di mana ia mengharapkan bit stop data dibalik. Ini juga bisa disebabkan oleh korupsi data yang disebabkan oleh interferensi garis yang menimpa stop bit. Anda selalu perlu memeriksa ini untuk setiap byte yang diterima.
Kesalahan paritas terjadi ketika paritas diterapkan pada tautan data dan ada korupsi yang menyebabkan ketidaksesuaian paritas dalam data yang diterima. Anda selalu perlu memeriksa ini untuk setiap byte yang diterima.
Receive break juga dianggap sebagai kesalahan meskipun itu benar-benar indikasi bahwa data yang masuk telah jatuh ke nol logis selama lebih dari 1 byte data. Biasanya logis 1 adalah keadaan "ambient" antara byte data berturut-turut dan tetap seperti ini. Saya pikir ini melempar ke sistem telegrafi lama. Saya tidak akan repot memeriksa ini kecuali Anda menggunakan "fitur" ini untuk menunjukkan (katakanlah) perintah reset ke penerima.
Overrun error adalah ketika byte baru diterima sebelum byte sebelumnya dibaca oleh CPU. Sedikit berbeda ketika FIFO terlibat tetapi sama artinya - data yang diterima yang valid hilang karena kelambatan CPU. Selalu periksa ini sebelum membaca byte dan jika byte tersebut merupakan bagian dari pesan yang lebih panjang (atau perintah), buang seluruh pesan / perintah tersebut dan mintalah pemancar untuk mengirim ulang seluruh pesan / perintah tersebut.
Sedang berjalan bukan benar-benar kesalahan tetapi menunjukkan kepada UART pengirim bahwa buffer pengirimannya kosong yaitu meminta byte baru untuk mengirimkan. Anda tidak perlu memeriksa ini.
sumber
Untuk mengatasi kesalahan ini, Anda harus menerapkan protokol logis tingkat yang lebih tinggi. sesuatu yang mirip dengan TCP, atau periksa tumpukan OSI untuk ide-ide.
pada dasarnya, dua bagian penting untuk memulai adalah checksum, dan timeout. menggunakan algoritma untuk menghitung nilai redunden yang mewakili, dalam bentuk yang lebih kecil, isi setiap pesan. kemudian periksa ini di pesan yang diterima. jika jumlahnya tidak cocok, Anda mungkin mendapatkan kesalahan pembingkaian, kebisingan sedikit, dll, dll. dan Anda harus membuang pesan dan mencoba semacam pemulihan, mengirim ulang, sinyal NACK (tidak acknlowledged), dll.
juga, pastikan untuk mengimplementasikan batas waktu dalam protokol tingkat atas Anda. jika Anda mendapatkan semacam kesalahan pembingkaian, UART Anda mungkin tidak akan pernah pulih dan mulai diproses lagi. mungkin menunggu bit stop pada bingkai yang menurut pengirim UART telah dikirim, tetapi rusak oleh noise, kemiringan jam, dll. ini akan mengirim kode input apa pun ke loop tak terhingga. pastikan bahwa Anda memiliki batas yang waras untuk berapa lama bacaan masukan Anda harus menunggu sampai memutuskan untuk meninggalkan pesan ini, dan sekali lagi, coba lagi, NACK, tinggalkan, dll.
sumber