找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 1742|回復(fù): 18
打印 上一主題 下一主題
收起左側(cè)

關(guān)于串行通信的起始位和停止位識(shí)別問(wèn)題請(qǐng)教大家

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
這幾天正看串口,雖然能勉強(qiáng)編程,但還是理解不徹底。串口數(shù)據(jù)發(fā)送格式如圖:有請(qǐng)高手說(shuō)下,接收方是如何區(qū)分起始位和數(shù)據(jù)0的?停止位和1是如何區(qū)分的?空閑時(shí)數(shù)據(jù)線上是高電平,如果發(fā)送FF,會(huì)出現(xiàn)8個(gè)1,會(huì)不會(huì)識(shí)別為空閑?謝謝大家。

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

IMG_20240907_152334.jpg
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

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

使用道具 舉報(bào)

板凳
ID:227818 發(fā)表于 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還是起始位,也就是說(shuō)如何定義發(fā)一個(gè)字節(jié)結(jié)束,知道一個(gè)字節(jié)結(jié)束后,再來(lái)一個(gè)0,就可以認(rèn)為是起始位,不會(huì)是連續(xù)的10個(gè)高電平后來(lái)的0是起始位吧,我曾用示波器觀察過(guò)連續(xù)發(fā)數(shù)據(jù)時(shí)的波形,發(fā)完一個(gè)字節(jié)后的空閑時(shí)間很短,也就是一個(gè)BIT多點(diǎn),然后就是起始位了。
回復(fù)

使用道具 舉報(bào)

地板
ID:786521 發(fā)表于 2024-9-8 19:39 | 只看該作者
首先,開(kāi)始數(shù)據(jù)傳輸之前,雙方會(huì)約定一個(gè)傳輸速率,即我們所說(shuō)的波特率;在不同時(shí)鐘的主機(jī)和從機(jī)中,主機(jī)都需要計(jì)數(shù)n次以達(dá)到一個(gè)波特率的傳輸時(shí)間。如果所使用的uart協(xié)議中規(guī)定起始位為低電平,停止位為高電平,數(shù)據(jù)位長(zhǎng)度固定為8bit,停止位1bit,那么接受方就會(huì)偵測(cè)起始位,并且在每個(gè)計(jì)數(shù)周期進(jìn)行一次數(shù)據(jù)采樣,直到停止位。
回復(fù)

使用道具 舉報(bào)

5#
ID:624769 發(fā)表于 2024-9-8 21:51 | 只看該作者
你對(duì)"位"這個(gè)字怎么理解?
既然叫"起始位", 那么這個(gè)位置自然就是固定的0, 既然叫"停止位"那么這個(gè)位置就是固定的1,和數(shù)據(jù)位的0/1所在位置不同,如何會(huì)無(wú)法區(qū)分呢? 發(fā)送FF 也好 發(fā)送00也好,始終都是要由起始位開(kāi)始的,既然開(kāi)始了,怎么會(huì)認(rèn)為是空閑呢?
回復(fù)

使用道具 舉報(bào)

6#
ID:227818 發(fā)表于 2024-9-9 09:02 | 只看該作者
188610329 發(fā)表于 2024-9-8 21:51
你對(duì)"位"這個(gè)字怎么理解?
既然叫"起始位", 那么這個(gè)位置自然就是固定的0, 既然叫"停止位"那么這個(gè)位置就是 ...

我的意思是如何定義一次傳輸?shù)拈_(kāi)始,如果雙方都認(rèn)為是閑置狀態(tài),那么發(fā)送方發(fā)出一個(gè)低電平,接收方會(huì)識(shí)別為起始位,開(kāi)始收數(shù)據(jù),那沒(méi)有問(wèn)題。如果上電的一瞬間,電路電平不穩(wěn)定,或者電路出了問(wèn)題,比如說(shuō)傳輸過(guò)程中出現(xiàn)干擾,甚至斷路,然后又連接上了,這個(gè)時(shí)候肯定會(huì)出現(xiàn)亂碼,如果雙方不重現(xiàn)確認(rèn)一次起始位,會(huì)一直亂下去嗎?
回復(fù)

使用道具 舉報(bào)

7#
ID:192020 發(fā)表于 2024-9-9 09:08 | 只看該作者
newlined 發(fā)表于 2024-9-8 16:31
是的,波特率最重要,波特率要設(shè)定相同,關(guān)鍵是如何確定起始位,就是收到一個(gè)0后,如何確定這個(gè)是0還是起 ...

既然叫起始位那第一位收到的就是起始位,第二位收到的才是0
回復(fù)

使用道具 舉報(bào)

8#
ID:161164 發(fā)表于 2024-9-9 09:22 | 只看該作者
以我理解
不要把起始位當(dāng)作一個(gè)位
用的到的只是那一個(gè)下降沿
當(dāng)收到下降沿就開(kāi)始定時(shí)掃描(如9600,就是104us)
掃描8次之后,就完成一次通信
結(jié)束位也不是一個(gè)位
只是用來(lái)回復(fù)高電平,為下一個(gè)起始位(下降沿)作準(zhǔn)備
回復(fù)

使用道具 舉報(bào)

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

起始位(Start Bit)
起始位是一個(gè)邏輯低電平(0),用來(lái)標(biāo)識(shí)一個(gè)字符幀的開(kāi)始。
在空閑狀態(tài)下,串行線路上通常保持高電平(邏輯1)。當(dāng)線路從高電平轉(zhuǎn)變?yōu)榈碗娖綍r(shí),接收方就知道一個(gè)新的字符即將到達(dá)。
起始位之后跟著的是數(shù)據(jù)位,即實(shí)際要傳輸?shù)男畔ⅰ?br /> 停止位(Stop Bit)
停止位是一個(gè)或多個(gè)邏輯高電平(1),用來(lái)標(biāo)識(shí)一個(gè)字符幀的結(jié)束。
停止位可以是1位、1.5位或者2位長(zhǎng)度,這取決于通信雙方的約定。
發(fā)送完數(shù)據(jù)位后,發(fā)送方會(huì)發(fā)送停止位,告知接收方該字符幀已經(jīng)結(jié)束。
如何區(qū)分
實(shí)際上,在硬件層面上,起始位和停止位是通過(guò)電平的變化來(lái)自動(dòng)檢測(cè)的,并不需要用戶手動(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é)議來(lái)正確配置串口參數(shù)即可,硬件會(huì)自動(dòng)處理起始位和停止位的識(shí)別與使用。如果你正在編寫驅(qū)動(dòng)程序或底層固件,則需要理解這些位是如何工作的,并確保你的代碼正確地實(shí)現(xiàn)了這些位的生成和檢測(cè)。
回復(fù)

使用道具 舉報(bào)

10#
ID:227818 發(fā)表于 2024-9-9 11:10 | 只看該作者
qq475878026 發(fā)表于 2024-9-9 09:08
既然叫起始位那第一位收到的就是起始位,第二位收到的才是0

第二位開(kāi)始應(yīng)該收到的是數(shù)據(jù)了
回復(fù)

使用道具 舉報(bào)

11#
ID:227818 發(fā)表于 2024-9-9 11:12 | 只看該作者
lkc8210 發(fā)表于 2024-9-9 09:22
以我理解
不要把起始位當(dāng)作一個(gè)位
用的到的只是那一個(gè)下降沿

是的,應(yīng)是檢測(cè)下降沿,問(wèn)題是收到1后,再收到0,也是先收到一個(gè)下降沿。
回復(fù)

使用道具 舉報(bào)

12#
ID:1109793 發(fā)表于 2024-9-9 19:24 | 只看該作者
newlined 發(fā)表于 2024-9-9 09:02
我的意思是如何定義一次傳輸?shù)拈_(kāi)始,如果雙方都認(rèn)為是閑置狀態(tài),那么發(fā)送方發(fā)出一個(gè)低電平,接收方會(huì)識(shí)別 ...

我的理解是發(fā)送一個(gè)0,告訴對(duì)方我要發(fā)東西了,約定了波特率就定義了每個(gè)信號(hào)的寬度,從第一個(gè)0開(kāi)始,每隔一個(gè)寬度時(shí)間記錄一個(gè)信號(hào),直到8(9)個(gè)信號(hào)接完了就算一組信號(hào)完成了。后面的持續(xù)的高電平就告訴接收端本次結(jié)束了,用來(lái)復(fù)位接收用的計(jì)數(shù)器。中間有干擾當(dāng)然就是錯(cuò)誤的數(shù)據(jù)了。所以才有校驗(yàn)啊,校驗(yàn)不對(duì)就扔掉數(shù)據(jù)重新等待下次的。
回復(fù)

使用道具 舉報(bào)

13#
ID:384109 發(fā)表于 2024-9-9 23:09 | 只看該作者
沒(méi)學(xué)過(guò)數(shù)字電路和通訊吧,這個(gè)是按時(shí)間采樣數(shù)據(jù)的
回復(fù)

使用道具 舉報(bào)

14#
ID:283954 發(fā)表于 2024-9-10 02:53 | 只看該作者
newlined 發(fā)表于 2024-9-9 09:02
我的意思是如何定義一次傳輸?shù)拈_(kāi)始,如果雙方都認(rèn)為是閑置狀態(tài),那么發(fā)送方發(fā)出一個(gè)低電平,接收方會(huì)識(shí)別 ...

如果數(shù)據(jù)不斷傳送,當(dāng)然就一直亂下去,直到最少出現(xiàn)一個(gè)字節(jié)的停頓,這時(shí)全是高電位,停止位也已收到,等再接到一個(gè)低電位,就表示是起始位,又再同步了。
回復(fù)

使用道具 舉報(bào)

15#
ID:227818 發(fā)表于 2024-9-10 10:27 | 只看該作者
@xiaobendan001,“后面的持續(xù)的高電平就告訴接收端本次結(jié)束了,用來(lái)復(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ù)器,然后再收到低電平,則開(kāi)始計(jì)數(shù),接收數(shù)據(jù),接收完一個(gè)字節(jié),復(fù)位接受計(jì)數(shù)器,然后再收到低電平則認(rèn)為是下一字節(jié)的起始位,連續(xù)收到持續(xù)的高電平,再?gòu)?qiáng)制復(fù)位一次,確保下一次正確識(shí)別起始位?
回復(fù)

使用道具 舉報(bào)

16#
ID:227818 發(fā)表于 2024-9-10 11:10 | 只看該作者
lkc8210 發(fā)表于 2024-9-9 09:22
以我理解
不要把起始位當(dāng)作一個(gè)位
用的到的只是那一個(gè)下降沿

也許我有些明白了,您說(shuō)的對(duì),不要把起始位當(dāng)作一個(gè)位,用的到的只是那一個(gè)下降沿,接收方收到這個(gè)下降沿,馬上開(kāi)始計(jì)數(shù),相當(dāng)于每接收一個(gè)字節(jié)的數(shù)據(jù),就同步一次時(shí)鐘,時(shí)鐘不會(huì)出現(xiàn)累計(jì)的誤差,這就是稱為異步傳輸?shù)脑颍?/td>
回復(fù)

使用道具 舉報(bào)

17#
ID:227818 發(fā)表于 2024-9-10 11:52 | 只看該作者
dalaoshi 發(fā)表于 2024-9-10 02:53
如果數(shù)據(jù)不斷傳送,當(dāng)然就一直亂下去,直到最少出現(xiàn)一個(gè)字節(jié)的停頓,這時(shí)全是高電位,停止位也已收到,等 ...

對(duì)的,應(yīng)該是這樣,當(dāng)出現(xiàn)亂碼后,直到出現(xiàn)一個(gè)字節(jié)的停頓,然后才重新開(kāi)始,8樓lkc8210 老師說(shuō)過(guò):不要把起始位當(dāng)作一個(gè)位,用的到的只是那一個(gè)下降沿,也就是接收方收到這個(gè)下降沿,定時(shí)器開(kāi)始跑,計(jì)數(shù),相當(dāng)于每接收一個(gè)字節(jié)就同步一次,所以一般不會(huì)出現(xiàn)邏輯錯(cuò)誤,前幾天我算過(guò),串口接收方定時(shí)器的溢出速率是串口波特率的4倍,正好在中間采樣一次。
回復(fù)

使用道具 舉報(bào)

18#
ID:1059013 發(fā)表于 2024-9-10 13:09 | 只看該作者
newlined 發(fā)表于 2024-9-9 09:02
我的意思是如何定義一次傳輸?shù)拈_(kāi)始,如果雙方都認(rèn)為是閑置狀態(tài),那么發(fā)送方發(fā)出一個(gè)低電平,接收方會(huì)識(shí)別 ...

對(duì),這些問(wèn)題正是編程時(shí)要考慮及規(guī)避的
回復(fù)

使用道具 舉報(bào)

19#
ID:624769 發(fā)表于 2024-9-12 19:26 | 只看該作者
newlined 發(fā)表于 2024-9-9 09:02
我的意思是如何定義一次傳輸?shù)拈_(kāi)始,如果雙方都認(rèn)為是閑置狀態(tài),那么發(fā)送方發(fā)出一個(gè)低電平,接收方會(huì)識(shí)別 ...

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

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表