題:
為什麼我們需要啟動/停止位進行異步傳輸
amjad
2020-06-10 20:03:11 UTC
view on stackexchange narkive permalink

我正在讀一本書,上面寫著

之所以這樣命名,是因為信號的時序無關緊要。取而代之的是,信息按照約定的方式接收和翻譯。因此,為了提醒接收者新組的到來,需要在每個字節的開頭添加一個額外的位。該位通常為0,稱為起始位。為了讓接收者知道該字節已完成,在該字節的末尾附加了1個或更多附加位。這些位通常為1,稱為停止位。

如下圖所示:

enter image description here

我不太了解,為什麼我們需要一個開始/停止位?字節不是由8位組成的,所以接收方只需要計算到目前為止已收到的位數,如果數字為8,則它有1個字節並重複該過程。那麼為什麼我們需要啟動/停止位?

那麼,如果您不知道何時開始計數,該如何計數呢?請記住,消息不是連續的,並且可能偶爾出現,HI和LO都只有兩個狀態都已用來表示數據。沒有第三種狀態來表示沒有消息。
異步,無時鐘,您至少需要一個邊沿和一個商定的(或可能檢測到的)速率,以便您可以對這8位給定或接受(奇偶校驗,len等)進行中間位單元採樣。而且,這還不足以根據情況確定您所處的位置,直到您認為自己已同步為止,可能需要一些成幀錯誤。
即使您有時鐘,也不知道邊界在哪裡,但可能會有spi之類的東西,您有時鐘和選擇信號,因此您既可以看到採樣的地方,又可以看到如何分割採樣的東西,從而可以恢復它。另一方面。
“信號的定時無關緊要”-如果我聽過一個笑話,那就知道。
五 答案:
Andy aka
2020-06-10 20:05:50 UTC
view on stackexchange narkive permalink

如果您沒有從零開始的比特開始計時到接收器,那麼當串行字節與數據流中的前一位數字同時出現時,您如何知道該怎麼辦?如果下一個位也為1,之後的位也為1,如果所有位均為1,該怎麼辦?然後您會錯過整個字節,因為什麼都不會改變(因為起始位為0)。

常規8個高位,前導零開始位:-

enter image description here

缺少起始位:-

enter image description here

評論不作進一步討論;此對話已[移至聊天](https://chat.stackexchange.com/rooms/109283/discussion-on-answer-by-andy-aka-why-we-need-start-stop-bit-for-異步交易)。
Cort Ammon
2020-06-12 01:33:31 UTC
view on stackexchange narkive permalink

除了可接受的答案外,另一個考慮因素是時間安排。您將在發送方和接收方時鐘之間漂移,因此接收方必須以一種或另一種方式“恢復”時鐘。有一些類似的方案,例如10 / 8B,它們使用空閒信號來執行此操作,但是UART中的簡單方法是具有一個“起始位”,該起始位的存在指示信號的上升沿。這使接收器可以重新同步其時鐘以接收即將到來的字節。

這些開始和停止模式必須經常發生,以確保在接收過程中對齊不會漂移得太遠。這導致開始位和停止位出現在每個字節中。這是一條簡單的規則,即使它在其他方面沒有達到“理想”的水平。

我想讓OP了解這一點很有意義。
Tanner Swett
2020-06-11 23:25:34 UTC
view on stackexchange narkive permalink

我不太了解,為什麼我們需要一個開始/停止位?字節不是由8位組成的,所以接收方只需要計算到目前為止已收到的位數,如果數字為8,則它有1個字節並重複該過程。那麼為什麼我們需要啟動/停止位?

接收器無法計算接收到的位數,因為接收器不知道是否接收到位!

讓我們假設發送者和接收者正在使用聲音進行通信,並且讓我們想像一個0代表一秒鐘的靜音,一個1代表一秒的聲音。在您的書中,“空閒狀態”(發送方在沒有任何實際數據要發送時發送的內容)為1,表示聲音。

現在假設您是接收者,而發送者沒有使用起始位。您會聽到八秒鐘的連續聲音。您只是聽到了字節“ 11111111”,還是發件人處於空閒狀態?您無法知道,因為所有這些聽起來對您都一樣。

或者,假設您聽到一秒鐘的沉默,然後聽到六秒鐘的聲音,然後聽到一秒鐘的沉默。您剛剛聽到字節“ 01111110”嗎?還是字節“ 11110111”後跟字節“ 11101111”?再次,您無法知道。

這是開始位的所在。每當發送方想要發送一個字節時,首先發送一個0(靜默一秒鐘),然後然後發送一個數據字節。

>

現在,您作為接收者的工作要容易得多!如果您聽到九秒鐘的聲音,則說明發件人只是在空閒。另一方面,如果您聽到一秒鐘的沉默,然後聽到八秒鐘的聲音,則說明發送方剛發送了字節“ 11111111”。

當然,大多數機器通信系統都不使用聲音;他們用電代替。但是電信號就像聲音一樣工作。接收器始終會接收某物,無論我們是否想要它。因此,我們需要給接收器某種方式,使其知道接收的是實際數據還是只是空閒噪聲。

要從您的評論中解決這個特定問題:

一個問題,如果我們沒有“ idle”值,那麼當沒有數據要發送時,接收器將什麼也不會接收,因此它可以將每8位計為一個字節,而無需停止/啟動位?

沒有空閒值在物理上是不可能的。如果您有電纜,則可以發送正電壓,負電壓或0電壓,但實際上不發送任何電壓是不可能的。這意味著無論我們做什麼,接收器總是會接收一些電壓。因此,我們必須給接收器某種方式來知道其接收的電壓是否有意義。

auspicious99
2020-06-10 21:54:43 UTC
view on stackexchange narkive permalink

也許困惑是因為當我們看到像您的問題這樣的圖表時,我們作為人類,我們確切地看到了所有位在哪裡,哪個在後面,等等,等等。但是,假設您是接收者,而您擁有的一切與之配合使用的是信號的傳入流(例如,兩個電平,一個電平(例如,高)表示一個1位,另一個電平(例如,低)表示一個0位),作為模擬電信號,或者穩定或從一個值更改為另一值。同樣,請注意,接收者不是從全局角度看到第一位,第二位等的人。

比方說,“ idle”值與1位值(高)相同。然後,除非我們從1過渡到0,否則您不知道這些位何時開始到達。否則,如果第一個位為1,您如何知道它何時開始?

然後對於停止位,您希望它與開始位相反(因此,您希望它的值為1),因此它標誌著一個字節的結束,並且您可以知道下一個字節何時開始。再次從高到低。

您還可以辯稱,它不是全局視圖,而是非因果視圖。這不僅是非因果關係的,而且在某些人或某物已經弄清楚一切開始和結束的地方並標記了它們之後,繪製了這些圖。您可能會說:“為什麼我們需要所有這些工作來解決這個問題?答案就在最後!在這裡使用!”
@auspicious99感謝您的答复。只是一個問題,如果我們沒有“ idle”值,那麼當沒有數據要發送時,接收器將什麼也不會接收,因此它可以將每8位計為一個字節而無需停止/啟動位?
@amjad為避免混淆,每個發送的字節都添加了開始和停止位,因此每次發送10位。有人仍稱其為波特率。接收器期望每字節數據10位。請記住,起始位和停止位有助於使接收器與數據保持同步。8位數據可以全為1或全為0。如果沒有從0到1或從1到0的過渡,則無法檢測到字節邊界。
請注意,在這種情況下,停止位並沒有真正“標記一個字節的末尾”,也沒有標記任何內容,該字節的末尾是從時間已知的。停止位在那裡將線路重置為空閒狀態,以便每當出現下一個開始位時都可以檢測到它。
@vsz感謝您的回答。但是,我們真的需要停止位來將線路重置為空閒狀態嗎?有人告訴我,當頻道空閒時,它仍向接收方發送1
但是通道如何“知道”它處於空閒狀態?;)
假設在變送器側的@amjad,您有一個開關,並且必須始終通過將開關置於一個位置或另一個位置來選擇一個或另一個值。
@amjad:也許更容易想到起始位只是將線路返回到空閒狀態,而不是一點。
@amjad:“因此它可以將每8位計數為一個字節,而無需停止/啟動位”:否。您正在描述同步通信(它具有使每個人的隨機漂移時鐘保持同步的類似問題)。在異步通信中,一個字節的結尾與下一個字節的開頭之間可以經過任何時間。該時間不必是傳輸位的時間的倍數。
@auspicious99:在沒有停止位的情況下,如果設備在使線路空閒一段時間之前發送了5,000個連續的零字節,該怎麼辦?接收方的時鐘將必須多麼精確地確定發送方已發送了5,000個零字節,而不是4,999個零和0x80,或5,000個零後跟0xFF?有多種設計異步協議的方法,可以確保在任何連續通信中不使用停止位而進行週期性的線路轉換,但是大多數UART無法配置為支持它們。
supercat
2020-06-12 02:39:51 UTC
view on stackexchange narkive permalink

如果空閒線路由狀態相同的連續流表示,且沒有清晰的開始,則每次傳輸都必須通過發送不同於空閒線路條件的內容開始,而不管傳輸的第一位是零還是一個。因此,在沒有其他指示傳輸何時開始的方法的情況下,通常在同步和異步協議中都必須使用起始位,因為空閒線與統一的一或零字符串無法區分。

雖然有一些設計協議的方法不需要字節之間的單獨的起始位和停止位,從而將通信效率提高了10%,但它們往往比當前設計為機械方式的協議更為複雜。通過螺線管,電機和一些凸輪進行解碼。沒有停止位的情況下要做的一件棘手的事情是,如果開始位始終將線路驅動到空閒狀態的相反方向,並且每個數據位可以獨立地為高或低,則發送許多連續的零字節的動作可以簡單地將線路長時間拉低而無需任何過渡,以確保發送方和接收方保持同步。



該問答將自動從英語翻譯而來。原始內容可在stackexchange上找到,我們感謝它分發的cc by-sa 4.0許可。
Loading...