0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

我們怎么測量實(shí)際的波特率呢?

GReq_mcu168 ? 來源:玩轉(zhuǎn)單片機(jī) ? 2020-09-02 11:43 ? 次閱讀

平時使用串口打印出現(xiàn)亂碼的絕大部分原因是串口波特率沒對。那么我們怎么測量實(shí)際的波特率呢?在這之前,順便一起回顧一下波特率的概念。

什么是波特率、比特率?

比特率(Bitrate)表示每秒鐘傳輸?shù)亩M(jìn)制位數(shù),單位為比特每秒(bit/s)。

波特率(Baudrate)表示每秒鐘傳送的碼元符號的個數(shù),是衡量數(shù)據(jù)傳送速率的指標(biāo)。

碼元是通訊信號調(diào)制的概念,通訊中常用時間間隔相同的符號來表示一個二進(jìn)制數(shù)字,這樣的信號稱為碼元。

常見的通訊傳輸中,用 0V 表示數(shù)字 0, 5V 表示數(shù)字 1,那么一個碼元可以表示兩種狀態(tài) 0 和 1,所以一個碼元等于一個二進(jìn)制比特位,此時波特率的大小與比特率一致。

如果在通訊傳輸中,有 0V、2V、 4V 以及 6V 分別表示二進(jìn)制數(shù) 00、 01、 10、 11,那么每個碼元可以表示四種狀態(tài),即兩個二進(jìn)制比特位,所以碼元數(shù)是二進(jìn)制比特位數(shù)的一半,這個時候的波特率為比特率的一半。

因?yàn)楹芏喑R姷耐ㄓ崳ū热绱谕ㄓ崳┲幸粋€碼元都是表示兩種狀態(tài),所以大家常常直接以波特率來表示比特率 。

串口通訊協(xié)議

在串口通訊的協(xié)議層中,規(guī)定了數(shù)據(jù)包的內(nèi)容,它由啟始位、主體數(shù)據(jù)、校驗(yàn)位以及停止位組成,通訊雙方的數(shù)據(jù)包格式要約定一致才能正常收發(fā)數(shù)據(jù),其數(shù)據(jù)幀組成如下:

下面我們來實(shí)際驗(yàn)證一下其數(shù)據(jù)幀是不是真的是這樣的。編寫如下代碼:

代碼很簡單,就是使用串口不斷地往外發(fā)數(shù)據(jù)0xAA(當(dāng)然發(fā)送其它數(shù)據(jù)也是可以的) 。我們的串口配置如下:

我們可以使用示波器或者邏輯分析儀抓取實(shí)際信號看看數(shù)據(jù)是不是符合上面的幀格式。這里,我們使用邏輯分析儀抓取USART1的發(fā)送信號線(TX):

從實(shí)際結(jié)果中我們可以看到的確是按幀格式來發(fā)的。這里可能會有人有疑問,上面那個數(shù)據(jù)幀的圖片中有個空閑狀態(tài),這個又是什么呢?空閑、空閑,當(dāng)然是沒有在發(fā)數(shù)據(jù)時候的狀態(tài)呀,我們把我們的代碼改為:

在初始化完成之后只發(fā)送一次0xAA,邏輯分析儀抓到的數(shù)據(jù)為:

可見,空閑狀態(tài)是個高電平。在上一個的范例中,我們一直在while循環(huán)中發(fā)送數(shù)據(jù)0xAA,所以就沒有空閑狀態(tài)。

在這個實(shí)驗(yàn)中我們需要知道的是兩個點(diǎn)是:

串口發(fā)送數(shù)據(jù)是低位先發(fā)的。我們單片機(jī)發(fā)0xAA(10101010B),所以邏輯分析儀抓到的有效數(shù)據(jù)是01010101B。

單片機(jī)的串口使用的是TTL電平,為正邏輯電平信號。邏輯分析儀抓到的數(shù)據(jù)0對應(yīng)著實(shí)際電壓0~0.5V,數(shù)據(jù)1對應(yīng)著實(shí)際電壓2.4V-5V,

經(jīng)常與TTL電平標(biāo)準(zhǔn)做對比的是RS-232電平標(biāo)準(zhǔn),如:

常見的電子電路中常使用 TTL 的電平標(biāo)準(zhǔn),理想狀態(tài)下,使用 5V 表示二進(jìn)制邏輯 1,使用 0V 表示邏輯 0;而為了增加串口通訊的遠(yuǎn)距離傳輸及抗干擾能力,RS-232電平標(biāo)準(zhǔn)使用-15V 表示邏輯 1, +15V 表示邏輯 0。

在舊式的臺式計算機(jī)中一般會有 RS-232 標(biāo)準(zhǔn)的COM 口(也稱DB9 接口) :

在這個示例程序中,我們設(shè)置的串口波特率為115200bps。在串口通訊中,碼元只用1個二進(jìn)制數(shù)來表示(即只有0 和 1兩種狀態(tài)),所以波特率與比特率在數(shù)值上是相等的。

而比特率表示的是每秒鐘傳輸?shù)亩M(jìn)制位數(shù),那我們知道傳一位數(shù)據(jù)的時間豈不是就可以反推出波特率是多少了嗎?從邏輯分析儀中,我們可以知道發(fā)送一位數(shù)據(jù)的時間如下:

發(fā)送一位數(shù)據(jù)的時間大約為8.667us,所以1秒鐘發(fā)送多少位數(shù)據(jù)是可以算出來的:

算出來的波特率為115380bps,與115200bps很相近。最終肯定是有一定的誤差,這個誤差產(chǎn)生的原因包括邏輯分析儀的質(zhì)量及我們的測量環(huán)境等等因素。但是這個誤差也是在允許的范圍內(nèi)的,可以看看串口助手接收到的數(shù)據(jù)是不是正確的:

可見,數(shù)據(jù)接收正確,也就是波特率對的上了。

串口波特率對不上怎么解決?

在實(shí)際中。我們可能會遇到這樣的情況,代碼里配置的波特率與串口助手上設(shè)置的波特率一樣了,但還是出現(xiàn)異常情況。

異常情況如我們往串口助手發(fā)送字符串,串口助手上本該顯示的字符串出現(xiàn)了亂碼?;蛘呶覀兺谥职l(fā)送一個數(shù)據(jù),發(fā)現(xiàn)數(shù)據(jù)移位了。

出這種情況大多是波特率對應(yīng)不上,我們就得自己檢查我們的底層文件了,代碼中的某個與波特率計算相關(guān)的值(時鐘)與實(shí)際不匹配了,就會出現(xiàn)這樣的現(xiàn)象,比如之前我的一位同事就遇到這樣的情況就是這個原因?qū)е碌摹?/p>

我們用STM32的時候,一般都是使用外部晶振,比如STM32F103系列,可輸入的外部晶振的范圍是4~16MHz:

經(jīng)驗(yàn)值往往是8MHz,而且一般的demo工程底層代碼里默認(rèn)的也是設(shè)置為8MHz,比如:

但是,如果實(shí)際晶振貼的不是8M的話,就出問題了(比如串口波特率就不正確了)。追根溯源,串口波特率是配進(jìn)USART_Init函數(shù)中的,打開這個函數(shù):

計算串口波特率需要一個apbclock變量,而這個值得來源從RCC_GetClocksFreq函數(shù)來,再打開這個函數(shù):

所以要注意的是,HSE_VALUE這個值要與實(shí)際做對應(yīng)。

遇到這種問題找誰說理去。。經(jīng)驗(yàn)就是不斷采坑不斷積累的一個過程,早點(diǎn)遇到坑可能也是一件好事。像類似底層的問題很少遇到,但是一旦遇到那就得比較棘手的問題了,需要很有耐心地去查找。

能用穩(wěn)定的芯片是一件很幸福的事情,用不穩(wěn)定、不成熟的芯片的時候,那個才是真的難啊,遇到問題真是讓人懷疑人生啊,軟件、硬件、芯片都可能有問題。。。

以上就是本次的筆記分享,希望各位喜歡!如有錯誤歡迎指出,謝謝!

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 二進(jìn)制
    +關(guān)注

    關(guān)注

    2

    文章

    795

    瀏覽量

    41689
  • 串口通訊
    +關(guān)注

    關(guān)注

    1

    文章

    260

    瀏覽量

    24972
  • 波特率
    +關(guān)注

    關(guān)注

    2

    文章

    307

    瀏覽量

    34201

原文標(biāo)題:串口通訊你真的會了嗎?

文章出處:【微信號:mcu168,微信公眾號:硬件攻城獅】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    can波特率計算

    can波特率其實(shí)并不難計算,這里給出了can波特率的簡單計算,并給出了實(shí)例STM32的CAN波特率計算。講解CAN波特率計算原理。
    發(fā)表于 12-14 17:02 ?1.3w次閱讀
    can<b class='flag-5'>波特率</b>計算

    什么是串口波特率?串口波特率的分類及應(yīng)用詳解

    什么是串口波特率串口波特率是指串口通信系統(tǒng)中傳輸數(shù)據(jù)的速率。在UART串口通信中,數(shù)據(jù)以位(bit)的形式傳輸,波特率是指每秒鐘傳輸?shù)奈粩?shù)。在串口通信中,波特率是非常重要的參數(shù),因?yàn)?/div>
    的頭像 發(fā)表于 08-08 10:09 ?6041次閱讀
    什么是串口<b class='flag-5'>波特率</b>?串口<b class='flag-5'>波特率</b>的分類及應(yīng)用詳解

    STM32 | 通俗易懂地串口通訊解析 精選資料分享

    平時使用串口打印出現(xiàn)亂碼的絕大部分原因是串口波特率沒對。那么我們怎么測量實(shí)際波特率?在這之前
    發(fā)表于 08-10 07:51

    怎么測量實(shí)際波特率

    平時使用串口打印出現(xiàn)亂碼的絕大部分原因是串口波特率沒對。那么我們怎么測量實(shí)際波特率?在這之前
    發(fā)表于 01-13 06:47

    使用cubemx設(shè)置的波特率實(shí)際檢測的波特率不一致。

    板子型號:stm32f407zgt6問題:波特率不一致問題。使用cubemx設(shè)置一個500k的波特率。設(shè)置參數(shù)如下:但是使用這個波特率去發(fā)送代碼,CANalyst-ii怎么也接收不到,最后使用
    發(fā)表于 08-13 09:08

    串口通訊實(shí)際波特率測量

    平時使用串口打印出現(xiàn)亂碼的絕大部分原因是串口波特率沒對。那么我們怎么測量實(shí)際波特率?在這之前
    的頭像 發(fā)表于 04-04 17:27 ?7240次閱讀
    串口通訊<b class='flag-5'>實(shí)際</b>的<b class='flag-5'>波特率</b><b class='flag-5'>測量</b>

    STM32下波特率計算詳解

    : STM32串口波特率通過USART_BRR進(jìn)行設(shè)置,STM32的波特率寄存器支持分?jǐn)?shù)設(shè)置,以提高精確度。USART_BRR的前4位用于表示小數(shù),后12位用于表示整數(shù)。但是它還不是我們想要設(shè)置的
    發(fā)表于 02-11 10:46 ?20次下載
    STM32下<b class='flag-5'>波特率</b>計算詳解

    波特率是如何工作的

    在本文中,我們將探討數(shù)據(jù)傳輸速率的挑戰(zhàn),并討論波特率在舊通信系統(tǒng)中的作用。
    的頭像 發(fā)表于 04-29 15:16 ?2345次閱讀
    <b class='flag-5'>波特率</b>是如何工作的

    如何用示波器測串口波特率

    如圖任意選取一比特位,用光標(biāo)測量可得,時間為:1.074us, 頻率位:930.909kHZ, 最接近的波特率為:921600, 所以所測信號的波特率為926100。
    的頭像 發(fā)表于 05-12 14:44 ?3889次閱讀

    波特率是什么?波特率設(shè)計

    從宏觀理解,波特率表征了串口的傳輸速度。
    的頭像 發(fā)表于 06-05 15:19 ?2.7w次閱讀
    <b class='flag-5'>波特率</b>是什么?<b class='flag-5'>波特率</b>設(shè)計

    如何區(qū)分語音芯片的比特波特率?

    比特是將數(shù)字聲音從模擬格式轉(zhuǎn)換為數(shù)字格式的采樣。采樣越高,復(fù)原后的音質(zhì)越好;而波特率是指從調(diào)制信號起的單位時間內(nèi)的變化,即單位時間內(nèi)載波參數(shù)發(fā)生了變化的次數(shù)。這是碼元傳輸
    的頭像 發(fā)表于 12-12 10:21 ?921次閱讀
    如何區(qū)分語音芯片的比特<b class='flag-5'>率</b>和<b class='flag-5'>波特率</b>?

    什么是波特率?為什么要設(shè)置波特率

    9600個比特的數(shù)據(jù)。二、串口通信為什么要設(shè)置波特率下面我們就以東用科技的OM302系列工業(yè)DTU為例,來給大家簡單描述一下串口通信為什么要設(shè)置波特率。DTU是指數(shù)
    的頭像 發(fā)表于 04-08 00:00 ?7014次閱讀
    什么是<b class='flag-5'>波特率</b>?為什么要設(shè)置<b class='flag-5'>波特率</b>?

    什么是波特率?波特率是如何影響CAN總線長度的?

    信息在通信通道中傳輸?shù)乃俾时环Q為波特率。通俗地說,波特率是數(shù)據(jù)在網(wǎng)絡(luò)上傳輸?shù)乃俣?速率。這是以比特/秒表示的。因此,一秒鐘內(nèi)在通信網(wǎng)絡(luò)上傳輸?shù)谋忍財?shù)就是波特率。
    的頭像 發(fā)表于 08-14 15:23 ?6527次閱讀
    什么是<b class='flag-5'>波特率</b>?<b class='flag-5'>波特率</b>是如何影響CAN總線長度的?

    什么是串口波特率?串口通信為什么要設(shè)置波特率?

    。串口通信為什么要設(shè)置波特率?今天,我們就來認(rèn)識波特率。什么是串口波特率?我們需要先了解一下什么是波特率
    的頭像 發(fā)表于 11-03 08:21 ?5375次閱讀
    什么是串口<b class='flag-5'>波特率</b>?串口通信為什么要設(shè)置<b class='flag-5'>波特率</b>?

    如何使用示波器測量串口波特率

    在通信和電子測量領(lǐng)域,串口波特率是一個至關(guān)重要的參數(shù),它決定了數(shù)據(jù)在串行通信線上的傳輸速率。使用示波器來測量串口波特率是一種常見且有效的方法,尤其是在沒有專業(yè)串口調(diào)試工具或需要更精確
    的頭像 發(fā)表于 05-27 16:25 ?5222次閱讀