国产精品久久久aaaa,日日干夜夜操天天插,亚洲乱熟女香蕉一区二区三区少妇,99精品国产高清一区二区三区,国产成人精品一区二区色戒,久久久国产精品成人免费,亚洲精品毛片久久久久,99久久婷婷国产综合精品电影,国产一区二区三区任你鲁

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這個值要與實際做對應。

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

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

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

    關注

    15

    文章

    1608

    瀏覽量

    82058
  • 波特率
    +關注

    關注

    2

    文章

    319

    瀏覽量

    35455
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    支持小數波特率的意義是什么

    我看芯源有一款MCU是支持小數波特率,支持小數波特率的意義是什么?是為了數據傳輸更穩定?
    發表于 12-11 07:15

    請問支持小數波特率接收數據的意義在哪兒?

    我看芯源支持小數波特率,話說,支持小數波特率接收數據的意義在哪兒?是通訊更有精度嗎?
    發表于 12-02 07:17

    UART波特率計算及UART收發回顯實驗

    決定串口波特率的寄存器有BRR(Bite Rate Rigister),SEMR(Serial Extended Mode Rigister)和MDDR(Modulation Duty
    的頭像 發表于 10-17 09:51 ?2493次閱讀
    UART<b class='flag-5'>波特率</b>計算及UART收發回顯實驗

    ATClient配合USART_V2使用時,無法開at_client_init后修改串口波特率是怎么回事?

    。 AT_SW_VERSION_NUM為0x10301,RTTHREAD的版本為0x50002。 有另一個項目用的串口是V1版本則正常,感覺是ATClient和串口V2在波特率修改的使用上有些地方不太兼容
    發表于 10-09 09:10

    串口波特率設置1200用不了是怎么回事?

    mcu:stm32f407zg 調試時,設置波特率為1200,而串口輸出為亂碼,電腦設置波特率19200來接收mcu的數據,卻能接收正確; (我以前沒有用RTT時,用stm32f103rct6
    發表于 09-23 07:19

    115200的波特率,為啥實際速度只有11KB/s?

    波特率≠真實速度! 這幾個概念確實容易混淆,但它們描述的是通信過程中不同層面的速率指標。讓我們一起來理清楚它們的區別和聯系↓ 主要區別解析 比特 (Bit Rate): 指每秒傳輸的二進制比特數量
    的頭像 發表于 09-10 11:18 ?455次閱讀

    波特率是什么

    波特率是串行通信中的一個核心參數,用于描述數據在傳輸線路上的傳輸速率。以下從定義、單位、與比特的關系、實際應用及設置注意事項等方面進行詳細說明: 一、定義與本質 波特率(Baud R
    的頭像 發表于 07-22 11:11 ?6292次閱讀

    可編程電源的通信波特率應如何設置?

    1000次查詢命令,統計錯誤響應次數。 閾值:誤碼率應<0.1%,若超標需降低波特率或檢查通信線路。 實時性測試 測量響應時間:發送控制命令(如VOLT 5設置電壓為5V),用示波器或
    發表于 07-07 15:01

    基于瑞薩64位MPU RZ/G2L的uboot串口波特率支持介紹

    本文主要介紹基于瑞薩64位MPU RZ/G2L,討論uboot下非常規波特率115200的支持方法,用于解決客戶對uboot下特殊波特率的需求,供客戶參考。
    的頭像 發表于 07-04 15:54 ?2811次閱讀
    基于瑞薩64位MPU RZ/G2L的uboot<b class='flag-5'>串口</b>多<b class='flag-5'>波特率</b>支持介紹

    第十四章 USART——串口通訊

    本章介紹了USART串口通訊,含物理層(RS-232、TTL電平)、協議層(波特率、數據幀),及W55MH32的USART功能與應用。
    的頭像 發表于 06-14 16:30 ?1565次閱讀
    第十四章 USART——<b class='flag-5'>串口</b><b class='flag-5'>通訊</b>

    STM32U575串口接收+GPDMA波特率不匹配怎么解決?

    我用CubeMX配置的串口+GPDMA接收,115200波特率正常能用, 然后如果波特率設置錯誤為9600,再改回來115200,接收就不能用了,調試好像時DMA出錯了,然后啟用HAL_UARTEx_ReceiveToIdle_
    發表于 03-07 07:59

    STM32G070 UART串口,低波特率傳送數據時,TIMER出現嚴重延時現象如何解決?

    STM32G070, UART串口,低波特率傳送數據時,TIMER出現嚴重延時現象,傳送數據長的話,導致系統重啟。如何解決?
    發表于 03-07 07:07

    CAN總線十萬個為什么 | CAN自定義波特率有什么用?

    導讀CAN總線通信中,波特率一致并不總能保證通信順暢。本文將揭秘自定義波特率的原理和應用,探討如何通過優化采樣點和提高容忍度解決通信問題,助力工程師提升通信穩定性。通常情況下,CAN總線通信只需確保
    的頭像 發表于 02-07 11:36 ?1130次閱讀
    CAN總線十萬個為什么 | CAN自定義<b class='flag-5'>波特率</b>有什么用?

    AN-891: ADuC703x系列LIN波特率計算

    電子發燒友網站提供《AN-891: ADuC703x系列LIN波特率計算.pdf》資料免費下載
    發表于 01-14 15:53 ?0次下載
    AN-891: ADuC703x系列LIN<b class='flag-5'>波特率</b>計算

    請問MSC1210串口UART1如何設置波特率

    如題,MSC1210的手冊上面有提到,UART0的波特率可以進行選擇,可選擇為T1的溢出作為波特率的設置,但是UART1的波特率如何設置?是和UART0的波特率一樣嗎?還是需要其他
    發表于 01-02 08:27