精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

串口通訊實際的波特率測量

汽車玩家 ? 來源:嵌入式大雜燴 ? 作者:嵌入式大雜燴 ? 2020-04-04 17:27 ? 次閱讀

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

什么是波特率、比特率?

比特率(Bitrate)表示每秒鐘傳輸的二進制位數,單位為比特每秒(bit/s)。

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

碼元是通訊信號調制的概念,通訊中常用時間間隔相同的符號來表示一個二進制數字,這樣的信號稱為碼元。

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

如果在通訊傳輸中,有 0V、2V、 4V 以及 6V 分別表示二進制數 00、 01、 10、 11,那么每個碼元可以表示四種狀態,即兩個二進制比特位,所以碼元數是二進制比特位數的一半,這個時候的波特率為比特率的一半。因為很多常見的通訊(比如串口通訊)中一個碼元都是表示兩種狀態,所以大家常常直接以波特率來表示比特率 。

串口通訊協議

在串口通訊的協議層中,規定了數據包的內容,它由啟始位、主體數據、校驗位以及停止位組成,通訊雙方的數據包格式要約定一致才能正常收發數據,其數據幀組成如下:

串口通訊實際的波特率測量

下面我們來實際驗證一下其數據幀是不是真的是這樣的。編寫如下代碼:

串口通訊實際的波特率測量

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

串口通訊實際的波特率測量

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

串口通訊實際的波特率測量

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

串口通訊實際的波特率測量

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

串口通訊實際的波特率測量

可見,空閑狀態是個高電平。在上一個的范例中,我們一直在while循環中發送數據0xAA,所以就沒有空閑狀態。

在這個實驗中我們需要知道的是兩個點是:

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

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

經常與TTL電平標準做對比的是RS-232電平標準,如:

串口通訊實際的波特率測量

常見的電子電路中常使用 TTL 的電平標準,理想狀態下,使用 5V 表示二進制邏輯 1,使用 0V 表示邏輯 0;而為了增加串口通訊的遠距離傳輸及抗干擾能力,RS-232電平標準使用-15V 表示邏輯 1, +15V 表示邏輯 0。

在舊式的臺式計算機中一般會有 RS-232 標準的 COM 口(也稱 DB9 接口) :

在這個示例程序中,我們設置的串口波特率為115200bps。在串口通訊中,碼元只用1個二進制數來表示(即只有0 和 1兩種狀態),所以波特率與比特率在數值上是相等的。而比特率表示的是每秒鐘傳輸的二進制位數,那我們知道傳一位數據的時間豈不是就可以反推出波特率是多少了嗎?從邏輯分析儀中,我們可以知道發送一位數據的時間如下:

串口通訊實際的波特率測量

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

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

串口通訊實際的波特率測量

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

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

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

異常情況如我們往串口助手發送字符串,串口助手上本該顯示的字符串出現了亂碼。或者我們往串口助手發送一個數據,發現數據移位了。

出這種情況大多是波特率對應不上,我們就得自己檢查我們的底層文件了,代碼中的某個與波特率計算相關的值(時鐘)與實際不匹配了,就會出現這樣的現象,比如之前我的一位同事就遇到這樣的情況就是這個原因導致的。

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

串口通訊實際的波特率測量

經驗值往往是8MHz,而且一般的demo工程底層代碼里默認的也是設置為8MHz,比如:

串口通訊實際的波特率測量

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

串口通訊實際的波特率測量

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

串口通訊實際的波特率測量

所以要注意的是,HSE_VALUE這個值要與實際做對應。

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

能用穩定的芯片是一件很幸福的事情,用不穩定、不成熟的芯片的時候,那個才是真的難啊,真讓人懷疑人生啊。。。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 串口
    +關注

    關注

    14

    文章

    1533

    瀏覽量

    75463
  • 波特率
    +關注

    關注

    2

    文章

    290

    瀏覽量

    33926
收藏 人收藏

    評論

    相關推薦

    串口通信中的波特率你真的了解嗎?差距竟如此重要!

    波特率串口通信中的作用在串口通信中,波特率起著至關重要的作用。因為在傳輸數據時,發送方和接收方需要以相同的波特率進行通信。如果兩端的
    的頭像 發表于 08-27 11:46 ?552次閱讀
    <b class='flag-5'>串口</b>通信中的<b class='flag-5'>波特率</b>你真的了解嗎?差距竟如此重要!

    USBH CDC如何修改通訊波特率

    硬件平臺:正點原子探索者 + CH340 軟件:CubeMX,MDK 已經實現USBH接口通過CH340和外部串口通訊波特率19200。 目前無法修改通訊
    發表于 05-31 06:07

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

    在通信和電子測量領域,串口波特率是一個至關重要的參數,它決定了數據在串行通信線上的傳輸速率。使用示波器來測量串口
    的頭像 發表于 05-27 16:25 ?2960次閱讀

    KT142C語音芯片工作電壓多少?電流是多少?串口波特率多少?多大的喇叭?

    KT142C-sop16語音芯片ic工作電壓多少?電流是多少?串口波特率是多少?支持多大的喇叭?
    的頭像 發表于 05-23 09:45 ?303次閱讀
    KT142C語音芯片工作電壓多少?電流是多少?<b class='flag-5'>串口</b><b class='flag-5'>波特率</b>多少?多大的喇叭?

    波特率有什么危害尼?又該如何避免?

    深入探討了波特率過高可能帶來的危害,并提供了一些實用建議來保護設備不受影響。在通信領域,波特率是決定數據傳輸速度的重要參數。然而,波特率設置不當可能會對設備造成嚴重的影響。本文旨在揭示波特率
    的頭像 發表于 04-03 16:45 ?939次閱讀

    使用cubemx設置CAN波特率實際測得的波特率不一致的原因?

    使用cubemx設置CAN波特率實際測得的波特率不一致。
    發表于 03-26 07:06

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

    假如要測量波特率為9600, 則每一比特位的時間為:1/9600 ≈ 104 μs,一般示波器橫向上每個大格子里5個小格子,要想看清一比特位一般需要一個小格子就夠了,則時基為:104 μs * 5 = 520 μs, 也就是說時基要500 μs。
    發表于 03-18 12:25 ?1703次閱讀
    如何用示波器<b class='flag-5'>測量</b><b class='flag-5'>串口</b><b class='flag-5'>波特率</b>

    為啥要轉換波特率 波特率和傳輸速率的關系

    對于串行多主 CAN 總線,如果波特率被稱為“500000波特”,則 CAN 上的該端口每秒最多可傳輸500000位。
    的頭像 發表于 03-06 17:38 ?3534次閱讀
    為啥要轉換<b class='flag-5'>波特率</b> <b class='flag-5'>波特率</b>和傳輸速率的關系

    波特率發生器使用哪個定時器 波特率發生器的時鐘來源是什么

    波特率發生器是一種用于控制串行數據通信速率的設備,它可以生成特定波特率的時鐘信號。在嵌入式系統、通信設備和計算機硬件中,波特率發生器的使用十分常見。波特率發生器通常使用定時器來實現時鐘
    的頭像 發表于 01-24 09:56 ?1423次閱讀

    什么是串口波特率串口通信為什么要設置波特率

    什么是串口波特率串口通信為什么要設置波特率波特率與比特的關系 如何選擇
    的頭像 發表于 01-22 16:10 ?1548次閱讀

    單片機的各個通信協議的波特率

    下面是一些常見的波特率數值,這些波特率通常被用于串口通信,SPI、I2C、CAN等接口的實際波特率可能有所不同:USART:110bps30
    的頭像 發表于 12-09 08:00 ?2236次閱讀
    單片機的各個通信協議的<b class='flag-5'>波特率</b>

    請問arduino如何自動設置串口波特率?

    arduino 如何自動設置串口波特率? 根據通訊機的波特率自動設置本身的波特率
    發表于 11-10 07:16

    什么是串口波特率串口通信為什么要設置波特率

    在電子設備的世界中,數據是通過各種方式進行傳輸的。其中,串口通信是一種常見的數據傳輸方式,它以其簡單、可靠和廣泛的特性,成為了電子設備間通信的重要手段。而在串口通信中,有一個非常重要的參數——波特率
    的頭像 發表于 11-03 08:21 ?3786次閱讀
    什么是<b class='flag-5'>串口</b><b class='flag-5'>波特率</b>?<b class='flag-5'>串口</b>通信為什么要設置<b class='flag-5'>波特率</b>?

    Linux中如何在stty修改串口波特率

    Linux內核啟動后,串口波特率通常是115200或者9600,此時如果想要修改串口波特率,在shell中通過stty指令就能完成,而不需要修改驅動代碼。 stty:set tty
    的頭像 發表于 10-04 15:28 ?1069次閱讀

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

    假如要測量波特率為9600, 則每一比特位的時間為:1/9600 ≈ 104 μs,一般示波器橫向上每個大格子里5個小格子,要想看清一比特位一般需要一個小格子就夠了,則時基為:104 μs * 5 = 520 μs, 也就是說時基要500 μs。
    的頭像 發表于 09-23 10:41 ?2454次閱讀
    如何用示波器<b class='flag-5'>測量</b><b class='flag-5'>串口</b><b class='flag-5'>波特率</b>?