找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1478|回復: 18
打印 上一主題 下一主題
收起左側

關于串行通信的起始位和停止位識別問題請教大家

  [復制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:227818 發(fā)表于 2024-9-7 15:38 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
這幾天正看串口,雖然能勉強編程,但還是理解不徹底。串口數(shù)據(jù)發(fā)送格式如圖:有請高手說下,接收方是如何區(qū)分起始位和數(shù)據(jù)0的?停止位和1是如何區(qū)分的?空閑時數(shù)據(jù)線上是高電平,如果發(fā)送FF,會出現(xiàn)8個1,會不會識別為空閑?謝謝大家。

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

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

使用道具 舉報

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

使用道具 舉報

板凳
ID:227818 發(fā)表于 2024-9-8 16:31 | 只看該作者
huashanhui20 發(fā)表于 2024-9-7 22:10
串口通信中,首先最重要的是波特率,收發(fā)雙方約定多少時間為一個bit位,然后空閑是高電平,當接收方收到一 ...

是的,波特率最重要,波特率要設定相同,關鍵是如何確定起始位,就是收到一個0后,如何確定這個是0還是起始位,也就是說如何定義發(fā)一個字節(jié)結束,知道一個字節(jié)結束后,再來一個0,就可以認為是起始位,不會是連續(xù)的10個高電平后來的0是起始位吧,我曾用示波器觀察過連續(xù)發(fā)數(shù)據(jù)時的波形,發(fā)完一個字節(jié)后的空閑時間很短,也就是一個BIT多點,然后就是起始位了。
回復

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

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

使用道具 舉報

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

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

使用道具 舉報

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

使用道具 舉報

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

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

在編程配置串口通信時,你需要設定好起始位、數(shù)據(jù)位、奇偶校驗位以及停止位的具體參數(shù)。例如,在大多數(shù)情況下,起始位始終是一個低電平位,而停止位是一個或多個高電平位。這些參數(shù)的選擇會影響到數(shù)據(jù)傳輸?shù)目煽啃浴?br />
總之,在實際應用中,你只需要按照所使用的通信協(xié)議來正確配置串口參數(shù)即可,硬件會自動處理起始位和停止位的識別與使用。如果你正在編寫驅(qū)動程序或底層固件,則需要理解這些位是如何工作的,并確保你的代碼正確地實現(xiàn)了這些位的生成和檢測。
回復

使用道具 舉報

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

第二位開始應該收到的是數(shù)據(jù)了
回復

使用道具 舉報

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

是的,應是檢測下降沿,問題是收到1后,再收到0,也是先收到一個下降沿。
回復

使用道具 舉報

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

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

使用道具 舉報

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

使用道具 舉報

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

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

使用道具 舉報

15#
ID:227818 發(fā)表于 2024-9-10 10:27 | 只看該作者
@xiaobendan001,“后面的持續(xù)的高電平就告訴接收端本次結束了,用來復位接收用的計數(shù)器”我的困惑歸根到底就是接收方如何判斷一個字節(jié)的接受完成,您這句話提醒了我,接收方是不是不定時強制復位接受計數(shù)器,比如每當收到10個位的1時,這時肯定是空閑狀態(tài),強制復位接受計數(shù)器,然后再收到低電平,則開始計數(shù),接收數(shù)據(jù),接收完一個字節(jié),復位接受計數(shù)器,然后再收到低電平則認為是下一字節(jié)的起始位,連續(xù)收到持續(xù)的高電平,再強制復位一次,確保下一次正確識別起始位?
回復

使用道具 舉報

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

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

使用道具 舉報

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

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

使用道具 舉報

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

對,這些問題正是編程時要考慮及規(guī)避的
回復

使用道具 舉報

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

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

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

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

快速回復 返回頂部 返回列表