Soru:
Başlangıç ​​biti ve durdurma biti neden gereklidir?
Tom
2017-10-22 03:24:39 UTC
view on stackexchange narkive permalink

Seri iletişimi öğreniyorum ve başlangıç biti ile durdurma bitlerinin neden gerekli olduğunu anlayamıyorum.

Seri bağlantı noktalarından bağlanan iki cihazım olduğunu ve 1 bitinin + 15V ile ve 0 bitinin -15V ile temsil edildiğini söylüyorum.

Dolayısıyla, cihaz 1 'in 4 biti 0110 cihaz 2 ' ye göndermesi için cihaz 1 ,aşağıdaki voltajlar: -15V + 15V + 15V -15V.

Burada eksik olan neyim, çünkü görünen o ki başlangıç biti ve durdurma biti / bitleri olmadan işe yarayabilir!

Boşta durumunu belirtmeyi unuttunuz.
Beş yanıtlar:
Tom Carpenter
2017-10-22 04:01:30 UTC
view on stackexchange narkive permalink

Bahsettiğiniz senaryo (başlama ve durdurma bitleriyle) muhtemelen UART'dır (RS232 bir türdür). UART, anahtar kısmı Eşzamansız olan Evrensel Eşzamansız Alım İletimi anlamına gelir. Saat hattı yok, sadece veri var.

Bu tür bir sistemde, ortak bir saati paylaşması gerekmeyen iki cihazınız (TX ve RX) vardır. Her iki sistem de örneğin 9600 Baud üzerinde anlaşabilir, ancak ortak bir saat olmadan biri 9601 Baud üretirken diğeri 9599 Baud alabilir. Saatler tam olarak doğru değildir, bu da zamanla ikisinin uyumsuzluğa kayacağı anlamına gelir.

Ek olarak, iletişim eşzamansız olduğu için, verici ne zaman isterse başlayabilir (akış kontrolünü yok sayarak). Verici ve alıcı farklı zamanlarda açılabilir ve alıcının ne zaman iletime başladığını bilme yolu yoktur.

Bu durumda temel gereksinim senkronizasyon olarak bilinir. Protokol, alıcıya iletmeye yeni başladığını sinyallemek için vericinin bir yolunu içermelidir. Ek olarak, saatleri her iki uçta da senkronize etmenin bir yolu olmalı.

UART durumunda, bu senkronizasyon, veri hattı üzerinde yüksekten alta geçiş şeklinde yapılır. Hat yüksekte boşta kalacak, ardından iletim başladığında alta düşecektir. Bu geçiş, her iki cihaz arasındaki zamanlamayı senkronize etme işlevi görür. Alıcı daha sonra baud saatine bağlı olarak yeterli veri döngüsünde çalışacağını bilir. Ancak bu şemada iki sorun var:

  1. Tek yüksekten alçağa geçiş, uzun bir süre boyunca zamanlamayı senkronize etmek için yeterli değildir. İki cihazın biraz farklı dahili saat hızlarına sahip olacağını unutmayın. Bu iki saat birbirinin belirli bir yüzdesi içinde olduğu sürece, geçiş, cihazları en fazla birkaç saat döngüsü için senkronize etmek için yeterli bilgi sağlayacaktır. Bu, periyodik yeniden senkronizasyona ihtiyacınız olduğu anlamına gelir.

  2. Hattınız boştaysa ve göndermek istediğiniz ilk veri biti de yüksek bir seviyeyle temsil ediliyorsa, o zaman bir geçişiniz yoktur. Hattınız boşta kalıyorsa ve göndermek istediğiniz ilk bit düşükse, aynı sorunla karşılaşırsınız. Bu, ilk parçayı ayırt etmek için bir yola ihtiyacınız olduğu anlamına gelir.

Bu sorunların her ikisi de UART durumunda başlatma ve durdurma bitleri kullanılarak çözülür. Gönderilen veriler birkaç bitlik paketlere bölünür (örneğin 8 bit). Her paketin önünde bir "düşük" başlangıç ​​biti ve ardından "yüksek" bir durdurma biti bulunur. Bu, her birkaç bit arasında bilinen bir yüksekten düşüğe geçiş olduğu anlamına gelir - son paketin durdurma biti ve geçerli paketin başlangıç ​​biti. Artık her paketi yeniden senkronize edebilirsiniz.


Bu, hiçbir şekilde sorunu çözmenin tek yolu değildir. Başka birçok şema vardır - Manchester kodlaması bir örnektir. Bu şemada düşükten yükseğe geçiş, mantık 1'i, yüksekten alçağa geçiş ise mantık 0'ı belirtir. Bu, gönderdiğiniz her bitin saat bilgisini kodladığı anlamına gelir, bu da gönderdiğiniz her biti yeniden senkronize edebileceğiniz anlamına gelir.

Üçlü - üç voltaj seviyesi kullanmak gibi başka sinyal yöntemlerine sahip olabilirsiniz. Örneğin, 2 için + 5V, 1 için 0V ve 0 için -5V kullanabilirsiniz. Boşta olduğunu belirtmek için bu durumlardan birini kullanarak bu sistem aracılığıyla ikili veri gönderebilirsiniz. Ancak bu örnekte, basitçe bir başlatma ve durdurma bitini üçüncü bir voltajda belirli bir süre ile değiştirdiniz. Periyodik yeniden senkronizasyon ihtiyacını değiştirmeyeceksiniz, bu yüzden size gerçekten hiçbir şey kazandırmaz ve sadece devreye karmaşıklık katar.

Trevor_G
2017-10-22 04:00:28 UTC
view on stackexchange narkive permalink

-15V + 15V + 15V -15V diyorsunuz. 0110, haklısınız, bir alıcı bunu doğru bir şekilde alabilir.

Peki ya 15V 15V 15V -15V gönderirseniz bunun ne olduğunu nasıl anlarsınız? Dinleyici olarak ilk duyacağınız şey ilk -15V olduğundan, bundan önce kaç tane 15V sinyal geldiğine dair hiçbir fikriniz olmazdı.

Gönderen ister 1110, ister 1101, 1011 veya 0111'i göndersin dinleyici aynı şeyi duyar.

enter image description here

Herhangi bir zaman referansı olmadan, hepsi bir voltaj sinyali gibi görünür.

Zaman uyumsuz sinyallerde zaman önemli olduğu için "DİNLEME" sinyali göndermeniz gerekir. RS232'de dinleme sinyali, hat üzerinde yüksekten alçağa geçiştir. Alıcıya "ŞİMDİ başlayarak, baud hızımda N bit veri göndermek üzereyim!" Diyor

enter image description here

Dikkat edin, bu örnekte 4 bit UART, her desenin artık benzersiz bir imzası var.

Durdurma biti, aktarımın sonunda hattın boşta durumuna geri dönmesini sağlar ve ayrıca alıcıya yeni alınan baytları işlemek, sıfırlamak ve bir sonraki başlangıç ​​bitini dinlemeye hazırlanmak için bir zaman penceresi verir.

Aşağıdaki resimde, ilk izin bir durdurma bitine sahip değildir. İlk verinin son biti sıfır olduğundan, bir sonraki başlangıç ​​biti geldiğinde satır zaten düşüktür ve UART'ı başlatmak için geçiş yoktur. Durdurma biti olan ikinci izde, düşükten önce yüksek garantilidir.

enter image description here

Aslında çoğu UARTS, alıcı için bu pencereyi daha fazla açmak için size birden fazla durdurma biti gönderme yeteneği sağlar. Bu, RS232 sinyalinin aslında doğrudan mekanik motorları ve röleleri yönlendirdiği seri iletimin ilk günlerinde daha önemliydi, ancak bugün hala kullanılabilir.

Ayrıca, çoğu UARTS aslında durdurma bitinin uygun bit zamanında yüksek olup olmadığını kontrol eder. Değilse, alıcıya bir çerçeveleme hatası bildirilir.

user287001
2017-10-22 04:03:31 UTC
view on stackexchange narkive permalink

Başlangıç biti, boşta kalma durumunun sonundaki uyandırmadır.Stopbit, yeni baytın başlangıcında bilinen bir geçiş olmasını sağlar.Sistem, mekanik veri aktarım cihazlarındaki (= teleprinterler) motorların her iki uçta da senkronize çalıştığından emin olma olasılığının olmadığı bir dönemde geliştirilmiştir.Yeniden senkronize etme yöntemi başlatma ve durdurma bitleriydi.

Bugün, bir bayttan çok daha uzun bit dizileri, yeniden eşitlemeye gerek kalmadan iletilebilmektedir.Ama nihayet tüm saatler birbirinden ayrılıyor ve senkronizasyon gerekiyor.Gerekli senkronizasyon verilerini, +% 25 ekstra kapasite gerektiren start&stopbitlerden çok daha etkili bir şekilde taşıyan çok sayıda kodlama sistemi geliştirilmiştir.

JonRB
2017-10-22 03:29:06 UTC
view on stackexchange narkive permalink

Tek bir yük için elbette ... belki ... muhtemelen.Ama ya bir veri akışı gönderiyorsanız.Alıcı, son yükün ne zaman bittiğinden ve yeni yükün başladığından nasıl emin olabilir?

Bir RS232 veri yolunun boşta durumu -12V'dir.Alıcı, 0'lık bir akış alacağını veya iletimin ne zaman başlayacağını nasıl bilecek?

Bu tür bir seri iletişim aynı zamanda eşzamansızdır.Alıcının, aktarımın yönlerini belirlemek için bir kenar görmesi gerekir

* "Alıcı, son yükün ne zaman sona erdiğinden ve yeni yükün başladığından nasıl emin olabilir?" * Yükün boyutu konusunda bir anlaşma yok mu, örneğin her yükün 8 bit olduğu?
@Tom doğru, sadece noktayı vurguluyordum.2 yollu radyodaki "Fazla" gibi
@Tom ama alıcı bu 8 bitlik yükün nerede başladığını nereden biliyor?Gönderilecek veri olmadığında zaman geçmeye devam edecek.
@Tom Carpenter * "ama alıcı yükün nerede başladığını nereden biliyor?" * Voltajın değiştiğini algıladığında anlar (üzgünüm elektrik hakkında hiçbir şey bilmiyorum, bu yüzden böyle bir şey olup olmadığını bilmiyorumolarak * "voltajın değiştiğini hissedin" *).
Voltajın değiştiğini algılaması için voltajın değişmesi gerekir.Hattın '1' olarak rölantide olduğunu düşünün.Şimdi, 8 bitlik yükün ilk bitinin '1' olduğunu varsayalım.Alıcı, voltajın "1" den "1" e değiştiğini nasıl algılar (ipucu: olamaz).UART, algılaması için bir voltaj değişikliği olduğunu garanti etmek için, sonunda 1 (durdurma biti) ve başlangıçta 0 (başlangıç biti) kullanır.Artık bir paket her başladığında garantili 1-> 0 geçişiniz var.
@Tom hala senkronize edilmesi gerekiyor.Saat, tüm seri iletişimlerde iletilmez (bazı türler iletimde, Manchester kodlamasında kodlanır).
@Tom Carpenter Ya rölanti 10V ise, şimdi voltaj değiştiğinde (+ 15V veya -15V olarak) algılayabilir.
@Tom, ancak artık ikili bir sinyalizasyon sisteminiz yok, ki bu UART durumunda tasarlandığı gibi değil.Ayrıca, belirli bir mesafe boyunca sinyalin zayıflayacağını, bu nedenle verici + 15V gönderirken, alıcı yalnızca + 10V alabilir.
RS232, "0" için + 3V ila + 15V ve "1" için -3V ila -15V voltaj aralığına sahiptir.bu aralıkta dönmeyen herhangi bir voltaj değişikliği bir kenar olarak değerlendirilmez
Gerçek ikili eşik, TTL ile aynı 1.3 ila 1.5 V arasındadır.
@Tony: Hangi özellik eşiğinden bahsediyorsunuz?
Tüm RS232 yongaları ve TTL aileleri için Vth spesifikasyonu, normalde bu şekilde verilmemiştir, ancak deneyimlerimden biliyorum.Bunu ayrıca Avg of Vil, Vih'den de elde edebilirsiniz.
old_timer
2017-10-22 08:18:42 UTC
view on stackexchange narkive permalink

Voltaj seviyelerini (RS-232 varsayıyoruz) ve seri protokolü (herkesin bir şeyleri adlandırmaya takıntılı olmadan önceki bir zamandan geldiği için uart diyelim) karıştırıyorsunuz.

Örneğinizi kullanarak örneğin 001100'den 0110'a söyleyemezsiniz. Uart protokolü ile, alıcının ortasının nerede olduğunu bilmesi için ideal olarak bit hücresinin ortasını örneklemeniz gerekir, farklı zaman kaynaklarında olmak ve tam olarak aynı olmamak, boştan gelen ilk kenar size bir referans verir. sonraki N bitinin ortasına vurmak için, N'nin ne kadar büyük olduğu her bir tarafın doğruluğuna bağlıdır, 8 veya daha fazla veri biti oldukça özensiz olabilir ve isterseniz bulduğunuz herhangi bir kenarı yeniden senkronize edebilirsiniz (örneğinizde 00000000 veya 11111111'i nasıl alırsınız?)

Başlangıç ​​biti bize boştan ayırmak için bir avantaj sağlar, mesajın ne zaman başladığını ve bitleri örneklemek için bir referans olduğunu söylemek gerekir. Durdurma biti, en az bir veya iki bitlik hücre için boşta kalmamızı sağlar. Veri ile doygun olduğunda, boşluk olmadığında, durdurma biti dışında boşta kalma olmadığında, ortada gelirseniz uart protokolünün mutlaka çözemeyeceği başka bir probleminiz olur (eşitlik yardımcı olur) (birisi fiş takar ve veri hareket ederken içeri girer) veya başka herhangi bir nedenle) başlangıç ​​ve bitiş bitleri, verileri eşitlik olmadan çerçevelemeye yardımcı olur, yine de nerede olduğunuzu anlayabilirsiniz, eşitlikle daha da iyi bir şansınız olur ama mükemmel değilsiniz.

Şimdi başka protokoller var. Diğer birçok protokol. gidip irig-106'ya bakın, bir başlangıç ​​biti yerine, başka bir modelden önce yüzlerce bit takip edilebilen bir senkronizasyon modeline sahipsiniz, ölü dönemler yok. İrig belgesinde, NRZ-L'nin basit bir uart (sıfır seviyesine dönülmez) ile alıştığımız şey olduğu çeşitli kodlamalardan oluşan güzel bir çizelge vardır, ilginç olanı ise iki fazlı-l Bir durum değişikliğinin olduğu orta bit hücresi 0110'unuz veri frekansının 2 katı ile iletilir ve 01101001 olur; en kötü durumda, aynı seviyede arka arkaya ikiden fazla yarım bit hücreye sahip olamazsınız, bit senkronizasyonu için birçok kenar.

Bir başka ilginç olanı, iki fazlı-L'yi kullandıkları mil-std-1553'tür (yalnızca iki fazlı veya manchester vb. birçok farklı adla popüler bir kodlamadır) ancak bu sürekli veri değildir, birden çok kelimeye. eşzamanlama modeli olarak üç yarım bit hücrenin ve üç yarım bit hücrenin kasıtlı bir biphase-1 hatasını kullanırlar ve sonra biphase-l'de kodlanmış mesaja giderler.

RS-232, RS-422, vb. voltaj seviyelerini uart protokolünden farklı bir şekilde kullanamamanız için hiçbir neden yok. Ancak, saatleri senkronize etmek için verilerde yine de sık sık kenarlara ihtiyaç duyarsınız (eğer saati de beraberinde getirirseniz, o zaman bu başka bir hikaye) ve bayt veya sözcük oluşturan bit gruplarının nerede olduğunu belirlemenin bir yolunu bulmanız gerekir. bu yüzden bir senkronizasyon modeline veya başlangıç ​​bitine veya başka bir şeye sahip olmanız gerekir. veya spi veya i2c gibi bir şey yaparak başlangıcı işaretleyin. klasik ethernet, bunun sonunu ve paketin başlangıcını belirtmek için bazı bitlerle uzun bir kare dalga kullandı. MDIO'da benzer bir şey var.

Günün sonunda, kelime / mesaj sınırlarının bit akışında nerede olduğunu bilmenin bir yolu olmadan güvenilir bir tek sinyal seri protokolüne sahip olamazsınız, benzer şekilde, her bit için nerede / ne zaman örnekleneceğini bilmeden de bunu yapamazsınız.Sürekli bir bit akışı olsa ve belki de sıfır zamanının ne zaman olduğunu bildiğinizi sanıyorsanız ve 8'e kadar sayıp başka bir baytı işaretleyebiliyorsanız bile, şanslı olabilirsiniz ancak saatiniz farklı birgöndericinin saatine göre referans ve kayacaktır.Böylece, bulduğunuz kenarlara periyodik olarak baktığınız ve saatlerin doğruluğu ile ilgili matematiğe dayalı olarak her N bitte bir kenar olduğundan emin olduğunuz sürece bunu çıkarmaya çalışabilirsiniz.



Bu Soru-Cevap, otomatik olarak İngilizce dilinden çevrilmiştir.Orijinal içerik, dağıtıldığı cc by-sa 3.0 lisansı için teşekkür ettiğimiz stackexchange'ta mevcuttur.
Loading...