標(biāo)題: 關(guān)于串行通信的起始位和停止位識別問題請教大家 [打印本頁]

作者: newlined    時(shí)間: 2024-9-7 15:38
標(biāo)題: 關(guān)于串行通信的起始位和停止位識別問題請教大家
這幾天正看串口,雖然能勉強(qiáng)編程,但還是理解不徹底。串口數(shù)據(jù)發(fā)送格式如圖:有請高手說下,接收方是如何區(qū)分起始位和數(shù)據(jù)0的?停止位和1是如何區(qū)分的?空閑時(shí)數(shù)據(jù)線上是高電平,如果發(fā)送FF,會(huì)出現(xiàn)8個(gè)1,會(huì)不會(huì)識別為空閑?謝謝大家。

IMG_20240907_152334.jpg (504.16 KB, 下載次數(shù): 6)

IMG_20240907_152334.jpg

作者: huashanhui20    時(shí)間: 2024-9-7 22:10
串口通信中,首先最重要的是波特率,收發(fā)雙方約定多少時(shí)間為一個(gè)bit位,然后空閑是高電平,當(dāng)接收方收到一個(gè)起始位(也就是符合一個(gè)bit位的低電平)就可以認(rèn)為是一幀數(shù)據(jù),至于后面的8個(gè)數(shù)據(jù)位只要符合0的時(shí)長就認(rèn)為是0,符合1就認(rèn)為是1,如果發(fā)送FF它也不會(huì)認(rèn)為是空閑,因?yàn)橛衅鹗嘉?是低電平
作者: newlined    時(shí)間: 2024-9-8 16:31
huashanhui20 發(fā)表于 2024-9-7 22:10
串口通信中,首先最重要的是波特率,收發(fā)雙方約定多少時(shí)間為一個(gè)bit位,然后空閑是高電平,當(dāng)接收方收到一 ...

是的,波特率最重要,波特率要設(shè)定相同,關(guān)鍵是如何確定起始位,就是收到一個(gè)0后,如何確定這個(gè)是0還是起始位,也就是說如何定義發(fā)一個(gè)字節(jié)結(jié)束,知道一個(gè)字節(jié)結(jié)束后,再來一個(gè)0,就可以認(rèn)為是起始位,不會(huì)是連續(xù)的10個(gè)高電平后來的0是起始位吧,我曾用示波器觀察過連續(xù)發(fā)數(shù)據(jù)時(shí)的波形,發(fā)完一個(gè)字節(jié)后的空閑時(shí)間很短,也就是一個(gè)BIT多點(diǎn),然后就是起始位了。
作者: shuas_Hu    時(shí)間: 2024-9-8 19:39
首先,開始數(shù)據(jù)傳輸之前,雙方會(huì)約定一個(gè)傳輸速率,即我們所說的波特率;在不同時(shí)鐘的主機(jī)和從機(jī)中,主機(jī)都需要計(jì)數(shù)n次以達(dá)到一個(gè)波特率的傳輸時(shí)間。如果所使用的uart協(xié)議中規(guī)定起始位為低電平,停止位為高電平,數(shù)據(jù)位長度固定為8bit,停止位1bit,那么接受方就會(huì)偵測起始位,并且在每個(gè)計(jì)數(shù)周期進(jìn)行一次數(shù)據(jù)采樣,直到停止位。
作者: 188610329    時(shí)間: 2024-9-8 21:51
你對"位"這個(gè)字怎么理解?
既然叫"起始位", 那么這個(gè)位置自然就是固定的0, 既然叫"停止位"那么這個(gè)位置就是固定的1,和數(shù)據(jù)位的0/1所在位置不同,如何會(huì)無法區(qū)分呢? 發(fā)送FF 也好 發(fā)送00也好,始終都是要由起始位開始的,既然開始了,怎么會(huì)認(rèn)為是空閑呢?
作者: newlined    時(shí)間: 2024-9-9 09:02
188610329 發(fā)表于 2024-9-8 21:51
你對"位"這個(gè)字怎么理解?
既然叫"起始位", 那么這個(gè)位置自然就是固定的0, 既然叫"停止位"那么這個(gè)位置就是 ...

我的意思是如何定義一次傳輸?shù)拈_始,如果雙方都認(rèn)為是閑置狀態(tài),那么發(fā)送方發(fā)出一個(gè)低電平,接收方會(huì)識別為起始位,開始收數(shù)據(jù),那沒有問題。如果上電的一瞬間,電路電平不穩(wěn)定,或者電路出了問題,比如說傳輸過程中出現(xiàn)干擾,甚至斷路,然后又連接上了,這個(gè)時(shí)候肯定會(huì)出現(xiàn)亂碼,如果雙方不重現(xiàn)確認(rèn)一次起始位,會(huì)一直亂下去嗎?
作者: Graves    時(shí)間: 2024-9-9 09:08
newlined 發(fā)表于 2024-9-8 16:31
是的,波特率最重要,波特率要設(shè)定相同,關(guān)鍵是如何確定起始位,就是收到一個(gè)0后,如何確定這個(gè)是0還是起 ...

既然叫起始位那第一位收到的就是起始位,第二位收到的才是0
作者: lkc8210    時(shí)間: 2024-9-9 09:22
以我理解
不要把起始位當(dāng)作一個(gè)位
用的到的只是那一個(gè)下降沿
當(dāng)收到下降沿就開始定時(shí)掃描(如9600,就是104us)
掃描8次之后,就完成一次通信
結(jié)束位也不是一個(gè)位
只是用來回復(fù)高電平,為下一個(gè)起始位(下降沿)作準(zhǔn)備

作者: Athath    時(shí)間: 2024-9-9 10:46
在串行通信(通常稱為串口通信)中,數(shù)據(jù)是以一連串的比特流形式發(fā)送的。為了確保接收端能夠正確地解析這些比特流,通信協(xié)議規(guī)定了一些特殊的位來同步收發(fā)雙方的數(shù)據(jù)傳輸過程。其中,起始位(Start Bit)和停止位(Stop Bit)就是這樣的標(biāo)志位。

起始位(Start Bit)
起始位是一個(gè)邏輯低電平(0),用來標(biāo)識一個(gè)字符幀的開始。
在空閑狀態(tài)下,串行線路上通常保持高電平(邏輯1)。當(dāng)線路從高電平轉(zhuǎn)變?yōu)榈碗娖綍r(shí),接收方就知道一個(gè)新的字符即將到達(dá)。
起始位之后跟著的是數(shù)據(jù)位,即實(shí)際要傳輸?shù)男畔ⅰ?br /> 停止位(Stop Bit)
停止位是一個(gè)或多個(gè)邏輯高電平(1),用來標(biāo)識一個(gè)字符幀的結(jié)束。
停止位可以是1位、1.5位或者2位長度,這取決于通信雙方的約定。
發(fā)送完數(shù)據(jù)位后,發(fā)送方會(huì)發(fā)送停止位,告知接收方該字符幀已經(jīng)結(jié)束。
如何區(qū)分
實(shí)際上,在硬件層面上,起始位和停止位是通過電平的變化來自動(dòng)檢測的,并不需要用戶手動(dòng)去區(qū)分它們。硬件(如微控制器中的UART接口)根據(jù)預(yù)先設(shè)置好的配置(例如波特率、數(shù)據(jù)位數(shù)、奇偶校驗(yàn)位、停止位數(shù)等)自動(dòng)處理這些位。

在編程配置串口通信時(shí),你需要設(shè)定好起始位、數(shù)據(jù)位、奇偶校驗(yàn)位以及停止位的具體參數(shù)。例如,在大多數(shù)情況下,起始位始終是一個(gè)低電平位,而停止位是一個(gè)或多個(gè)高電平位。這些參數(shù)的選擇會(huì)影響到數(shù)據(jù)傳輸?shù)目煽啃浴?br />
總之,在實(shí)際應(yīng)用中,你只需要按照所使用的通信協(xié)議來正確配置串口參數(shù)即可,硬件會(huì)自動(dòng)處理起始位和停止位的識別與使用。如果你正在編寫驅(qū)動(dòng)程序或底層固件,則需要理解這些位是如何工作的,并確保你的代碼正確地實(shí)現(xiàn)了這些位的生成和檢測。
作者: newlined    時(shí)間: 2024-9-9 11:10
qq475878026 發(fā)表于 2024-9-9 09:08
既然叫起始位那第一位收到的就是起始位,第二位收到的才是0

第二位開始應(yīng)該收到的是數(shù)據(jù)了
作者: newlined    時(shí)間: 2024-9-9 11:12
lkc8210 發(fā)表于 2024-9-9 09:22
以我理解
不要把起始位當(dāng)作一個(gè)位
用的到的只是那一個(gè)下降沿

是的,應(yīng)是檢測下降沿,問題是收到1后,再收到0,也是先收到一個(gè)下降沿。
作者: xiaobendan001    時(shí)間: 2024-9-9 19:24
newlined 發(fā)表于 2024-9-9 09:02
我的意思是如何定義一次傳輸?shù)拈_始,如果雙方都認(rèn)為是閑置狀態(tài),那么發(fā)送方發(fā)出一個(gè)低電平,接收方會(huì)識別 ...

我的理解是發(fā)送一個(gè)0,告訴對方我要發(fā)東西了,約定了波特率就定義了每個(gè)信號的寬度,從第一個(gè)0開始,每隔一個(gè)寬度時(shí)間記錄一個(gè)信號,直到8(9)個(gè)信號接完了就算一組信號完成了。后面的持續(xù)的高電平就告訴接收端本次結(jié)束了,用來復(fù)位接收用的計(jì)數(shù)器。中間有干擾當(dāng)然就是錯(cuò)誤的數(shù)據(jù)了。所以才有校驗(yàn)啊,校驗(yàn)不對就扔掉數(shù)據(jù)重新等待下次的。
作者: 人中狼    時(shí)間: 2024-9-9 23:09
沒學(xué)過數(shù)字電路和通訊吧,這個(gè)是按時(shí)間采樣數(shù)據(jù)的
作者: dalaoshi    時(shí)間: 2024-9-10 02:53
newlined 發(fā)表于 2024-9-9 09:02
我的意思是如何定義一次傳輸?shù)拈_始,如果雙方都認(rèn)為是閑置狀態(tài),那么發(fā)送方發(fā)出一個(gè)低電平,接收方會(huì)識別 ...

如果數(shù)據(jù)不斷傳送,當(dāng)然就一直亂下去,直到最少出現(xiàn)一個(gè)字節(jié)的停頓,這時(shí)全是高電位,停止位也已收到,等再接到一個(gè)低電位,就表示是起始位,又再同步了。
作者: newlined    時(shí)間: 2024-9-10 10:27
@xiaobendan001,“后面的持續(xù)的高電平就告訴接收端本次結(jié)束了,用來復(fù)位接收用的計(jì)數(shù)器”我的困惑歸根到底就是接收方如何判斷一個(gè)字節(jié)的接受完成,您這句話提醒了我,接收方是不是不定時(shí)強(qiáng)制復(fù)位接受計(jì)數(shù)器,比如每當(dāng)收到10個(gè)位的1時(shí),這時(shí)肯定是空閑狀態(tài),強(qiáng)制復(fù)位接受計(jì)數(shù)器,然后再收到低電平,則開始計(jì)數(shù),接收數(shù)據(jù),接收完一個(gè)字節(jié),復(fù)位接受計(jì)數(shù)器,然后再收到低電平則認(rèn)為是下一字節(jié)的起始位,連續(xù)收到持續(xù)的高電平,再強(qiáng)制復(fù)位一次,確保下一次正確識別起始位?
作者: newlined    時(shí)間: 2024-9-10 11:10
lkc8210 發(fā)表于 2024-9-9 09:22
以我理解
不要把起始位當(dāng)作一個(gè)位
用的到的只是那一個(gè)下降沿

也許我有些明白了,您說的對,不要把起始位當(dāng)作一個(gè)位,用的到的只是那一個(gè)下降沿,接收方收到這個(gè)下降沿,馬上開始計(jì)數(shù),相當(dāng)于每接收一個(gè)字節(jié)的數(shù)據(jù),就同步一次時(shí)鐘,時(shí)鐘不會(huì)出現(xiàn)累計(jì)的誤差,這就是稱為異步傳輸?shù)脑颍?hr noshade size="2" width="100%" color="#808080"> 作者: newlined    時(shí)間: 2024-9-10 11:52
dalaoshi 發(fā)表于 2024-9-10 02:53
如果數(shù)據(jù)不斷傳送,當(dāng)然就一直亂下去,直到最少出現(xiàn)一個(gè)字節(jié)的停頓,這時(shí)全是高電位,停止位也已收到,等 ...

對的,應(yīng)該是這樣,當(dāng)出現(xiàn)亂碼后,直到出現(xiàn)一個(gè)字節(jié)的停頓,然后才重新開始,8樓lkc8210 老師說過:不要把起始位當(dāng)作一個(gè)位,用的到的只是那一個(gè)下降沿,也就是接收方收到這個(gè)下降沿,定時(shí)器開始跑,計(jì)數(shù),相當(dāng)于每接收一個(gè)字節(jié)就同步一次,所以一般不會(huì)出現(xiàn)邏輯錯(cuò)誤,前幾天我算過,串口接收方定時(shí)器的溢出速率是串口波特率的4倍,正好在中間采樣一次。
作者: fishafish    時(shí)間: 2024-9-10 13:09
newlined 發(fā)表于 2024-9-9 09:02
我的意思是如何定義一次傳輸?shù)拈_始,如果雙方都認(rèn)為是閑置狀態(tài),那么發(fā)送方發(fā)出一個(gè)低電平,接收方會(huì)識別 ...

對,這些問題正是編程時(shí)要考慮及規(guī)避的
作者: 188610329    時(shí)間: 2024-9-12 19:26
newlined 發(fā)表于 2024-9-9 09:02
我的意思是如何定義一次傳輸?shù)拈_始,如果雙方都認(rèn)為是閑置狀態(tài),那么發(fā)送方發(fā)出一個(gè)低電平,接收方會(huì)識別 ...

你編寫過單片機(jī)代碼,并且使用串口, 應(yīng)該會(huì)發(fā)現(xiàn) 如果程序沒有做特定處理,上電初期出現(xiàn)一兩個(gè)亂碼是很常見現(xiàn)象。
一但因?yàn)楦鞣N原因,出現(xiàn)誤判的起始位,必定會(huì)有亂碼,這時(shí)候,起始位和停止位的作用就體現(xiàn)出來了,亂碼最多不會(huì)超過8個(gè)字節(jié)。一定會(huì)糾正過來,如果自己編寫上下位機(jī)代碼,停止位長度擴(kuò)大到8位,那么亂碼最多也就一個(gè)字節(jié)。




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1