İkili giriş yok ve sıfır arasındaki karışıklığı önlemek?


10

0 ile 2Hz ve 1 ile 4Hz arasında FM üzerinden veri ilettiğimi varsayalım. Hiçbir giriş olmadığında verici 2Hz iletiyor. Alınan ikiliyi bir mikrodenetleyicinin bir UART portuna besleseydim, mikrodenetleyici veri ve 0 arasında nasıl ayrım yapar?

Örneğin ASCII karakterleri iletirken bu önem kazanır. Aşağıdaki dizeyi varsayalım:

01000110 01101111 01101111 01100010 01100001 01110010

Boşluk eklediğim için bunu şu dile çevirebiliriz:

filanca

Ancak bir makine için dize şöyle görünecektir:

010001100110111101101111011000100110000101110010

İkili alırken ASCII karakterlerini karıştırmamak için bu "boşlukları" nasıl yaratırsınız?


5
UART bunu nasıl çözüyor link . Durdurun ve bitleri başlatın, zou bir UART bağlantı noktasına beslediğiniz için bunları da iletmelisiniz.
Bence Kaulics

Korkarım diyagramınızı tam olarak anlamadım. "Başlangıç ​​Biti" nin sıfır olduğu anlaşılıyor, bu da benim sorunumu yeniden başlatıyor. Örneğin, dizenin 000 01111000 000 olması durumunda 01111000 ve 00111100 arasındaki farkı nasıl bilebilir?
Allenph

2
@Allenph, otobüsü göndermediğinizde boşta ve mantıksal olarak yüksek durumda tutulur. Bir paketin iletimine başlarken ilk bit her zaman mantıksal olarak düşüktür. Bu başlangıç ​​bitidir. Ardından sekiz veri biti ve ardından mantıksal olarak yüksek bir durdurma biti izler. Mikroişlemci, yapılandırdığınız veri yolu hızını bildiği için bir sonraki bitin ne zaman geldiğini bilir. Hem mikroişlemcinin hem de mikroişlemciye iletim yapan birimin aynı iletim hızında yapılandırılması gerekir.
Mattias Johansson

Yanıtlar:


16

Mikroişlemcinin UART bağlantı noktasına bir şey beslerseniz, mikroişlemcinin ne beslediğinizi anlamasını istiyorsanız, UART iletişim protokolünü izlemeniz gerekir. Her ASCI karakterini bir başlangıç ​​biti, bir durdurma biti ve muhtemelen bir eşlik biti içeren bir UART paketine gömmeniz gerekir, UART Wikipedia sayfasında çok daha fazla bilgi mevcuttur .

Göndermedığınız zaman otobüs boşta ve mantıksal olarak yüksek bir durumda tutulur. Bir paketin iletimine başlarken ilk bit her zaman mantıksal olarak düşüktür. Bu başlangıç ​​bitidir. Ardından sekiz veri biti ve ardından mantıksal olarak yüksek bir durdurma biti izler. Mikroişlemci, yapılandırdığınız veri yolu hızını bildiği için bir sonraki bitin ne zaman geldiğini bilir. Bu nedenle, örneğin yan yana iki sıfır iletmek mümkündür. Hem mikroişlemcinin hem de mikroişlemciye iletim yapan birimin aynı iletim hızı, eşlik ve durdurma biti sayısı ile yapılandırılması gerekir.


2
Önemli nokta, yapılandırılmış stop bit sayısının maksimum değil minimum olması. Zaman uyumsuz seri hattın boş durumu genişletilmiş bir durdurma bitidir. Bu nedenle, radyonun 0'da rölantide olması gerekiyorsa , kolay cevap, radyoyu sürmeden önce UART çıkışını ters çevirmektir, böylece 0'da rölantide olur ve 1 bir başlangıç ​​olur. Ardından, alınan verileri bir UART ile işlemeden önce ters çevirin.
RBerteig

6

Bunun için birçok teknik var. Manchester kodlamasına veya NRZ kodlarına bakmak isteyebilirsiniz. Veya her 8 veri bitini saat kurtarma, hata düzeltme ve bir iletimin başlangıcını ve bitişini tespit etmek için kullanılabilen özel "virgül" sembollerine izin veren 10 bitlik bir diziye eşleyen 8b / 10b kodlaması .


5

Tüm ASCII karakterleri 8 bit genişliğindedir, bunu bir ASCII tablosunda görebilirsiniz. ASCII karakterlerin HEX değerleri FF'nin ötesine geçmiyor (1111 1111)

UART aynı anda birden fazla veri baytı (8 bit) alamaz, ayrıca 8 bit verinin yanında, aşağıda gösterilen resimde görebileceğiniz ve birlikte UART iletişim paketini oluşturan STOP ve START bitleri, PARITY ve birkaç tane daha vardır.

resim açıklamasını buraya girin

Yani UART'a ASCII karakterleri gönderirken, bunları teker teker gönderiyorsunuz ve bu da dize nasıl yapılır. Bu dizenin sadece bir karakter dizisi olduğunu zaten biliyorsunuz.


4
ascii 8 değil 7 bit, ancak hizalamayı önemsiz yapmak için 8 bitlik bir ısırık koymak yaygındır. Ayrıca diğer karakter setlerine ve utf8'e izin verir.
Hildred

0

Mattias'ın açıkladığı gibi UART protokolü, zamana dayalı asenkron bir protokoldür. Bitler arasındaki sınırları tanımlayan şey, başlangıç ​​bitinin başından itibaren alınan zamandır. Böylece mikrodenetleyici (N+half)/baudrate, başlangıç ​​biti başladıktan sonra bit saniyelerini "örnekleyecektir" . Yarım bit sadece bitlerin ortasında örneklemektir, böylece alıcı ve verici arasındaki zamanlamada yarım bit fark olabilir (farkların kümülatif olduğunu ve en kötü durumun her karenin son bitinde gerçekleştiğini unutmayın. ancak her zaman değil, yapılandırmaya bağlı olarak 8 bit genişliğinde). Çalıştırmanın anahtarı alıcı ve alıcı-vericiyi baudratlarla mümkün olduğunca yakın tutmaktır.

Böylece, mikrodenetleyici, her bir bitin bir çerçeve içinde nerede olduğunu bilmek için her bit arasındaki zamanı sayar. Bir sonraki karakter bir sonraki kareye gider. Her kare sona erdiğinde, mikro denetleyici bir sonraki kareyi otomatik olarak dinlemeye başlar, bu nedenle bir sonraki başlangıç ​​biti geldiğinde yeni bir kare başlatması gerektiğini zaten bilir. Karakterler böyle ayrılır.

Ayrıca, UART alan bir mikro denetleyiciye iletmek için aslında iki frekansa ihtiyacınız olmadığını da ekleyeceğim. FSK olarak iki frekans yerine OOK olarak tek bir frekans kullanabilirsiniz . Daha yüksek spektral verimliliğe sahiptir ve devreler çok daha basittir, çünkü sadece verici olarak bir taşıyıcı dalga değiştiriciye ve alıcı olarak tek bir frekans dedektörüne ihtiyacınız vardır, mors koduna çok benzer. Genellikle baud hızından çok daha yüksek frekanslara sahip taşıyıcılar kullanmayı unutmayın, aksi takdirde daha basit devreler düzgün çalışmaz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.