Menghindari kebingungan antara tidak ada input dan nol dalam biner?

10

Misalkan saya mentransmisikan data melalui FM di mana 0 adalah 2Hz dan 1 adalah 4Hz. Pemancar mengirimkan 2Hz ketika tidak ada input. Jika saya memasukkan biner yang diterima ke port UART mikrokontroler, bagaimana mikrokontroler akan membedakan antara tidak ada data dan 0?

Ini menjadi relevan ketika mentransmisikan karakter ASCII misalnya. Misalkan string berikut:

01000110 01101111 01101111 01100010 01100001 01110010

Karena saya telah menambahkan spasi, kami dapat menerjemahkan ini ke:

Foobar

Tetapi untuk mesin, string akan terlihat seperti ini:

010001100110111101101111011000100110000101110010

Bagaimana Anda membuat "spasi" itu sehingga Anda tidak mendapatkan karakter ASCII kacau ketika Anda menerima biner?

Allenph
sumber
5
Inilah cara UART memecahkannya, tautan . Berhenti dan mulai bit, karena Anda memasukkannya ke port UART, Anda juga harus mengirimkannya.
Bence Kaulics
Saya khawatir saya tidak begitu mengerti diagram Anda. Tampaknya "Mulai Bit" hanyalah nol, yang memulihkan masalah saya. Misalnya bagaimana ia mengetahui perbedaan antara 01111000 dan 00111100 jika stringnya adalah 000 01111000 000?
Allenph
2
@ Allenph, ketika Anda tidak mengirim bus itu menganggur dan disimpan dalam keadaan logis tinggi. Saat Anda memulai transmisi paket, bit pertama selalu rendah secara logis. Ini adalah bit awal. Kemudian ikuti delapan bit data dan kemudian stop bit yang secara logis tinggi. Mikroprosesor tahu kapan bit berikutnya tiba karena ia mengetahui kecepatan bus yang telah Anda konfigurasikan. Baik mikroprosesor dan unit yang mentransmisikan ke mikroprosesor perlu dikonfigurasi dengan kecepatan transmisi yang sama.
Mattias Johansson

Jawaban:

16

Jika Anda memberi makan sesuatu ke port UART mikroprosesor Anda harus mengikuti protokol komunikasi UART jika Anda ingin mikroprosesor memahami apa yang Anda makan itu. Anda perlu memasukkan setiap karakter ASCI ke dalam paket UART yang berisi bit mulai, bit stop, dan mungkin bit paritas, lebih banyak informasi tersedia di halaman Wikipedia UART .

Saat Anda tidak mengirim, bus itu menganggur dan disimpan dalam kondisi logis tinggi. Saat Anda memulai transmisi paket, bit pertama selalu rendah secara logis. Ini adalah bit awal. Kemudian ikuti delapan bit data dan kemudian stop bit yang secara logis tinggi. Mikroprosesor tahu kapan bit berikutnya tiba karena ia mengetahui kecepatan bus yang telah Anda konfigurasikan. Oleh karena itu, dimungkinkan untuk mentransmisikan misalnya dua nol bersebelahan. Baik mikroprosesor dan unit yang mentransmisikan ke mikroprosesor perlu dikonfigurasi dengan kecepatan transmisi yang sama, paritas dan jumlah bit stop.

Mattias Johansson
sumber
2
Poin kuncinya adalah bahwa jumlah bit stop yang dikonfigurasi adalah minimum, bukan maksimum. Status siaga baris serial async adalah bit pemberhentian yang diperpanjang. Jadi, jika radio harus diam di 0, maka jawaban mudahnya adalah membalikkan output UART sebelum menggerakkan radio dengannya sehingga idle di 0, dan 1 adalah permulaan. Kemudian balikkan data yang diterima sebelum menanganinya dengan UART.
RBerteig
6

Ada banyak teknik untuk ini. Anda mungkin ingin melihat Manchester coding atau kode NRZ. Atau pengkodean 8b / 10b , yang memetakan setiap 8 data bit ke urutan 10-bit yang memungkinkan pemulihan jam, koreksi kesalahan, dan simbol "koma" khusus yang dapat digunakan untuk mendeteksi awal dan akhir suatu transmisi.

pjc50
sumber
5

Semua karakter ASCII lebarnya 8bit, Anda bisa melihatnya di tabel ASCII. Nilai HEX karakter ASCII tidak melampaui FF (1111 1111)

UART tidak dapat menerima lebih dari satu byte data (8 bit) sekaligus, di samping itu data 8bit ada STOP dan START bit, PARITY dan beberapa lagi, yang dapat Anda lihat pada gambar di bawah ini dan yang bersama-sama membentuk paket komunikasi UART.

masukkan deskripsi gambar di sini

Jadi ketika Anda mengirim karakter ASCII ke UART, Anda mengirimnya satu per satu, dan begitulah cara string dibuat. Anda sudah tahu bahwa string hanyalah array karakter.

Lazar
sumber
4
ascii adalah 7 bit, bukan 8, namun itu umum untuk memasukkannya ke dalam gigitan 8 bit untuk membuat penyelarasan sepele. Ini juga memungkinkan set karakter lain dan utf8.
Hildred
0

Protokol UART, seperti dijelaskan Mattias, adalah protokol asinkron berbasis waktu. Apa yang mendefinisikan batas antara bit adalah waktu yang diambil dari awal bit awal. Jadi mikrokontroler akan "mencicipi" bit tersebut(N+half)/baudrate detik setelah bit mulai dimulai. Setengah bit hanya untuk sampel di tengah bit sehingga dapat memiliki setengah perbedaan sedikit dalam waktu antara penerima dan pemancar (ingat bahwa perbedaan bersifat kumulatif dan kasus terburuk terjadi pada bit terakhir dari setiap frame, yang biasanya, tetapi tidak selalu, lebar 8-bit, tergantung pada konfigurasi). Kunci untuk membuatnya berfungsi adalah memiliki penerima dan transceiver dengan baudrate sedekat mungkin.

Jadi, mikrokontroler menghitung waktu antara setiap bit untuk mengetahui di mana setiap bit berada di dalam sebuah frame. Karakter selanjutnya akan masuk ke bingkai berikutnya. Ketika setiap frame berakhir, mikrokontroler mulai mendengarkan frame berikutnya secara otomatis, jadi ketika bit start berikutnya datang, ia sudah tahu ia harus memulai frame baru. Begitulah karakter dipisahkan.

Selain itu, saya akan menambahkan bahwa Anda sebenarnya tidak memerlukan dua frekuensi untuk mengirim ke mikrokontroler penerima-UART. Anda dapat menggunakan frekuensi tunggal sebagai OOK alih-alih dua frekuensi sebagai FSK . Ini memiliki efisiensi spektral yang lebih tinggi dan sirkuit lebih sederhana, karena Anda hanya memerlukan pengalih gelombang pembawa sebagai pemancar dan detektor frekuensi tunggal sebagai penerima, cukup mirip dengan kode morse. Ingatlah untuk umumnya menggunakan operator dengan frekuensi yang jauh lebih tinggi daripada baudrate, jika tidak sirkuit yang lebih sederhana tidak akan berfungsi dengan baik.

Ronan Paixão
sumber