[導(dǎo)讀] 平時使用串口打印出現(xiàn)亂碼的,絕大部分原因是串口波特率沒對。那么,我們怎么測量實(shí)際的波特率呢?在這之前,順便一起回顧一下波特率的概念。什么是波特率、比特率?比特率(Bitrate)表示每秒鐘傳輸?shù)亩M(jìn)制位數(shù),單位為比特每秒(bit/s)。波特率(Baudrate)表示每秒鐘傳送的碼...
平時使用串口打印出現(xiàn)亂碼的,絕大部分原因是串口波特率沒對。那么,我們怎么測量實(shí)際的波特率呢?在這之前,順便一起回顧一下波特率的概念。
什么是波特率、比特率? 比特率(Bitrate)
表示每秒鐘傳輸?shù)?code style="margin: 0px 2px;padding: 2px 4px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;font-size: 14px;border-radius: 4px;background-color: rgba(27, 31, 35, 0.0470588);font-family: "Operator Mono", Consolas, Monaco, Menlo, monospace;word-break: break-all;color: rgb(239, 112, 96);">二進(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姷耐ㄓ崳?/span>比如串口通訊
)中一個碼元都是表示兩種狀態(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ì)算機(jī)中一般會有 RS-232 標(biāo)準(zhǔn)的?COM 口
(也稱?DB9 接口
) ?: 在這個示例程序中,我們設(shè)置的串口波特率為115200bps
。在串口通訊 中,碼元只用1個二進(jìn)制數(shù)來表示(即只有0 和 1兩種狀態(tài)),所以波特率與比特率在數(shù)值上是相等的。而比特率表示的是每秒鐘傳輸?shù)?code style="margin: 0px 2px;padding: 2px 4px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;font-size: 14px;border-radius: 4px;background-color: rgba(27, 31, 35, 0.0470588);font-family: "Operator Mono", Consolas, Monaco, Menlo, monospace;word-break: break-all;color: rgb(239, 112, 96);">二進(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)了亂碼。或者我們往串口助手發(fā)送一個數(shù)據(jù),發(fā)現(xiàn)數(shù)據(jù)移位了。出這種情況大多是波特率對應(yīng)不上
,我們就得自己檢查我們的底層文件了,代碼中的某個與波特率計(jì)算相關(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ù): 計(jì)算串口波特率需要一個apbclock
變量,而這個值得來源從RCC_GetClocksFreq
函數(shù)來,再打開這個函數(shù): 所以要注意的是,HSE_VALUE
這個值要與實(shí)際做對應(yīng)。遇到這種問題找誰說理去?經(jīng)驗(yàn)就是不斷踩坑、不斷積累的一個過程,早點(diǎn)遇到坑可能也是一件好事。像類似底層的問題很少遇到,但是一旦遇到那就得比較棘手的問題了,需要很有耐心地去查找。能用穩(wěn)定的芯片是一件很幸福的事情,用不穩(wěn)定、不成熟的芯片的時候,那個才是真的難啊,遇到問題真是讓人懷疑人生啊,軟件、硬件、芯片都可能有問題……以上就是本次的筆記分享,希望各位喜歡!如有錯誤歡迎指出,謝謝!END 作者:ZhengN 來源:嵌入式大雜燴 版權(quán)歸原作者所有,如有侵權(quán),請聯(lián)系刪除。 ▍
掃描二維碼,關(guān)注更多精彩內(nèi)容
本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除。
USR-N580是有人物聯(lián)網(wǎng)新開發(fā)的一款工業(yè)級8串口服務(wù)器,8串口獨(dú)立工作、互不影響;雙網(wǎng)口設(shè)計(jì),支持交換機(jī)功能,可級聯(lián),有效擴(kuò)展串口數(shù)量;采用Arm Cortex-M7方案,數(shù)據(jù)傳輸速度快且穩(wěn)定可靠;內(nèi)部集成TCP/I...
關(guān)鍵字:
物聯(lián)網(wǎng)
RS485
串口通訊
串口
串口服務(wù)器
交換機(jī)
點(diǎn)擊上方嵌入式開發(fā)圈?記得關(guān)注我們哦! 【134.1 ??應(yīng)用層的“半雙工”和“全雙工”。】 ? ?? ? 應(yīng)用層的“半雙工”。主機(jī)與從機(jī)在程序應(yīng)用層采用“一問一答”的查詢模式,主機(jī)是主動方,從機(jī)是被動方,主機(jī)問一句從機(jī)...
關(guān)鍵字:
應(yīng)用層
串口通訊
雙機(jī)
單片機(jī)在控制本地的外圍期間時,信息的交互是通過8位并行數(shù)據(jù)總線進(jìn)行的,但是在較大規(guī)模的現(xiàn)代控制系統(tǒng)中,單片機(jī)還需要控制遠(yuǎn)端的設(shè)備,可以利用單片機(jī)的串行通信模塊,在學(xué)習(xí)了RS-232串口通信的原理和時序后,學(xué)習(xí)了利用RS-...
關(guān)鍵字:
串口通訊
單片機(jī)
數(shù)據(jù)傳輸
在學(xué)習(xí)單片機(jī)和進(jìn)行單片機(jī)產(chǎn)品開發(fā)過程中,我們通常使用仿真器作為調(diào)試程序的有力工具。但仿真器價格昂貴,對于初學(xué)者和一般個人開發(fā)人員很難承受。為此,我們選用了帶ISP 功能的AT89S51/52 系列單片機(jī),不需要仿真器也能...
關(guān)鍵字:
串口通訊
在線系統(tǒng)
可編程器
一、串口通訊常識1.串口角色解析2.串口通訊參數(shù)串口通訊,分為同步通訊和異步通訊,我們通常使用的都是異步串口。通訊時,雙方先約定好數(shù)據(jù)幀的格式,即波特率,數(shù)據(jù)位,停止位,奇偶校驗(yàn)位等。波特率:這是一個
關(guān)鍵字:
串口通訊
驅(qū)動程序
資源使用說明:2410+LINUX、UART(即RS-232串口)全雙工通信、RS-485半雙工通信局部程序框圖及其設(shè)計(jì)說明:調(diào)試記錄及調(diào)試結(jié)果:MODBUS總結(jié):...
關(guān)鍵字:
2410
串口通訊
modbus協(xié)議
ascii模式
這兩天在某嵌入式系統(tǒng)做了個串口通訊程序,遇到了每次只接收8個字節(jié)的問題。相信很多人都遇到了。上網(wǎng)一查資料,找到串口配置結(jié)構(gòu)體struct termios中的c_cc[VTIME] 和?c_cc[VMI
關(guān)鍵字:
串口通訊
嵌入式系統(tǒng)
前言:串口通訊對于所有的嵌入式工程師十分常見,對于一個與外界交互的系統(tǒng)必須依賴一些手段,比如串口、USB、紅外、GPRS之類的數(shù)據(jù)通訊傳輸方式。而串口作為一種廉價的短距離可靠的通訊方式得到了廣泛應(yīng)用。廢話少說
關(guān)鍵字:
51
串口通訊
編程
軟件架構(gòu)
1、根據(jù)波特率和時鐘頻率設(shè)置T2L、T2H的初值2、通過輔助寄存器AUXR,設(shè)置T2啟動運(yùn)行,極其運(yùn)行方式3、通過ES打開串口中斷、通過EA打開總中斷1、主函數(shù)中可以直接使用SBUF=0xXX;向串口發(fā)送數(shù)據(jù)2、接收完數(shù)...
關(guān)鍵字:
串口通訊
單片機(jī)
串口通訊中發(fā)送的關(guān)鍵字一般為16進(jìn)制數(shù),輸出的數(shù)據(jù)也是16進(jìn)制數(shù),有負(fù)數(shù)存在時候要特殊處理。常用處理方法有兩種:1、較為常用的是高位定義,高位為1代表負(fù)數(shù),為0代表正數(shù),當(dāng)為負(fù)數(shù)顯示時,采用補(bǔ)碼顯示。2、將整
關(guān)鍵字:
串口通訊
編程
#ifndef __DEBUGSERIAL_H_#define __DEBUGSERIAL_H_#include "sys.h"#include "stdio.h"extern u...
關(guān)鍵字:
lpc1788
串口通訊
在這一篇文章中,舉例配置了F2370的UART,以實(shí)現(xiàn)與上位機(jī)(PC)的串口通訊,作為一種常用的調(diào)試手段,通常會作為庫函數(shù)加入到工程中,以便于編寫。因一些變更所以實(shí)驗(yàn)開發(fā)板從G2553變更為了F2370,當(dāng)然實(shí)際上因?yàn)槎?..
關(guān)鍵字:
uart
串口通訊
msp430f2370
這兩天在某嵌入式系統(tǒng)做了個串口通訊程序,遇到了每次只接收8個字節(jié)的問題。相信很多人都遇到了。上網(wǎng)一查資料,找到串口配置結(jié)構(gòu)體struct termios中的c_cc[VTIME] 和?c_cc[VMI
關(guān)鍵字:
串口通訊
嵌入式系統(tǒng)
我通過串口從下位機(jī)采集了四個數(shù)據(jù),但這四個數(shù)據(jù)通過指示控件顯示出來的卻出現(xiàn)連續(xù)的“數(shù)據(jù)”——“0”——“數(shù)據(jù)&r...
關(guān)鍵字:
LabVIEW
串口通訊
VISA是虛擬儀器軟件體系結(jié)構(gòu)的縮寫(即Virtual Instruments Software Architecture),實(shí)質(zhì)上是一個I/O口軟件庫及其規(guī)范的總稱。VISA是應(yīng)用于儀器編程的標(biāo)準(zhǔn)I/0應(yīng)用程序接口,是...
關(guān)鍵字:
LabVIEW
visa
串口通訊
開發(fā)過程經(jīng)常需要查看某些特定參數(shù)。通常的方法可以使用paintf進(jìn)行打印輸出,觀察具體的變量值。STM32內(nèi)部集成有USART的串口功能,可以通過串口直接輸出到電腦(上位機(jī))。使用非常方便,基本不需要不需要寫代碼,只
關(guān)鍵字:
STM32
串口通訊
首先要注意所用到的USART是否用到了復(fù)用功能千萬別忘了打開復(fù)用時鐘?。。。。。。。?!代碼如下:Hello! everyone,welcome to class!#includevoid delay_ms(u16 x){...
關(guān)鍵字:
STM32
串口通訊
串口通訊具有悠久歷史的,最基本、最簡單的通訊方式,即使在當(dāng)前這個注重移動和無線互聯(lián)的時代,也少不了串口通訊的身影。比如對小數(shù)據(jù)量數(shù)據(jù)的無線傳輸,雖然物理鏈路用藍(lán)牙或WIFI傳輸,但最后到單片機(jī)數(shù)據(jù)交互上,
關(guān)鍵字:
stm8s
串口通訊
單片機(jī)入門
藍(lán)牙模塊
介紹了一種無線搶答器系統(tǒng)的設(shè)計(jì)方案,其電路結(jié)構(gòu)簡單,單元電路由VHDL語言設(shè)計(jì)完成,利用EDA工具軟件Max+Plus II 10.0編譯仿真驗(yàn)證,并利用復(fù)雜可編程邏樣器件CPLD實(shí)現(xiàn)系統(tǒng)功能,而且與上位微機(jī)進(jìn)行串行通信...
關(guān)鍵字:
cpld
EDA
串口通訊
無線搶答器
隨著計(jì)算機(jī)系統(tǒng)的應(yīng)用和微機(jī)網(wǎng)絡(luò)的發(fā)展,通信功能越來越顯的重要。這里所說的通信是只計(jì)算機(jī)與外界的信息交換。因此,通信既包括計(jì)算機(jī)與外部設(shè)備之間,也包括計(jì)算機(jī)和計(jì)算
關(guān)鍵字:
串口通訊
接口電路
概念
電路設(shè)計(jì)