操屁眼的视频在线免费看,日本在线综合一区二区,久久在线观看免费视频,欧美日韩精品久久综

新聞資訊

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

    什么是波特率、比特率?

    比特率(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ù)的一半,這個時候的波特率為比特率的一半。

    因為很多常見的通訊(比如串口通訊)中一個碼元都是表示兩種狀態(tài),所以大家常常直接以波特率來表示比特率 。

    串口通訊協(xié)議

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

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

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

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

    從實際結(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)。

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

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

    單片機(jī)的串口使用的是 TTL 電平,為正邏輯電平信號。邏輯分析儀抓到的數(shù)據(jù) 0 對應(yīng)著實際電壓 0~0.5V,數(shù)據(jù) 1 對應(yīng)著實際電壓 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è)置的波特率一樣了,但還是出現(xiàn)異常情況。

    異常情況如我們往串口助手發(fā)送字符串,串口助手上本該顯示的字符串出現(xiàn)了亂碼。或者我們往串口助手發(fā)送一個數(shù)據(jù),發(fā)現(xiàn)數(shù)據(jù)移位了。

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

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

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

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

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

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

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

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

    習(xí)嵌入式的同學(xué)大多數(shù)都會使用串口與電腦通訊,但是你真的了解他的原理嗎,你知道他的波特率,停止位,校驗位,數(shù)據(jù)位到底代表什么含義呢?實際應(yīng)用中我們應(yīng)該注意他的那些東西來提高通訊的可靠性和穩(wěn)定性呢,今天我們就來聊一聊最常見的串口通訊。

    串口參數(shù)-COMMIX軟件

    串口定義

    串行接口簡稱串口,是指數(shù)據(jù)一位一位地按照順序發(fā)送,通信電路簡單,只需要兩根線(TX和RX)就可以實現(xiàn)數(shù)據(jù)的收發(fā),大大降低了成本,特別適合遠(yuǎn)距離通訊。

    在工業(yè)中串口應(yīng)用非常廣泛,如打印機(jī),臺式機(jī)電腦的顯示屏與主機(jī)連接,電話機(jī)等等。串口通訊過程中的可靠性非常重要,不能因為干擾或者外界因素影響。經(jīng)常會有客戶要求丟包率不能超過千分之一,軍工產(chǎn)品不允許超過十萬分之一。所以深入了解他的特性就非常重要,下面一一講解他的特性。

    串口的應(yīng)用

    數(shù)據(jù)格式

    串口的數(shù)據(jù)格式為停止位,校驗位,數(shù)據(jù)位和起始位。

    數(shù)據(jù)幀格式

    停止位可選1bits/1.5bits/2bits;校驗位可選擇為None/Odd/Even/Mark/Space;數(shù)據(jù)位可選為5bits/6bits/7bits和8bits;由于一個字節(jié)有8位,所以我們常見的串口的配置為1bits停止位,None校驗和8bits數(shù)據(jù)位。根據(jù)典型配置方式,我們來舉個例子看下數(shù)據(jù)在線上傳輸過程。

    如下,在不傳輸數(shù)據(jù)時候,信號位高電平,一旦單片機(jī)接收到發(fā)送數(shù)據(jù)指令時候,首先發(fā)送起始位,將電平拉低,然后在傳輸8個數(shù)據(jù)位,再傳輸一個停止位高位,表示這一個字節(jié)傳輸結(jié)束。單片機(jī)也是通過計算停止位和起始位之間的個數(shù)來判定這個傳輸是否正常的。

    數(shù)據(jù)0x55傳輸過程

    波特率

    波特率表示在單位時間內(nèi),傳輸位的個數(shù)。比如波特率9600bps,表示一秒能傳輸9600bits;如果按照1個停止位,無校驗位和8個數(shù)據(jù)位來配置,1S最多傳輸9600/10(1StopBits+8DataBits+1StartBits)個字節(jié),也就是960個字節(jié),這個非常重要,大家需要牢記.。1S中最大傳輸字節(jié)數(shù)=波特率/10。如115200bps就是11520字節(jié),以此類推。在示波器上測試停止的頻率就是他的波特率。

    示波器測試的波特率—傳輸速率

    校驗位

    對可靠性要求非常苛刻的設(shè)備都會帶上校驗位,來驗證傳輸?shù)臄?shù)據(jù)是否正常;如果傳輸出錯了會重新發(fā)送或者做對應(yīng)處理;分別有如下幾種校驗方式:

    1:even-每個字節(jié)傳送整個過程中bit為1的個數(shù)是偶數(shù)

    2:odd 每個字節(jié)傳送整個過程中bit為1的個數(shù)是奇數(shù)

    3:noparity 沒有校驗位

    4:space 校驗位總為0

    5:mark 校驗位總為1

    一般的校驗都有上述幾種,單片機(jī)會根據(jù)校驗位的正確與否決定重發(fā)或其他操作,提高通訊的可靠性。

    讀完我的文章,希望你下次做設(shè)計或者查問題時會更加地得心應(yīng)手,大家有什么想問的可以一起討論。

    問個問題,各位知道UART,RS232,RS485,RS422之間有什么區(qū)別嗎?一起來我的評論區(qū)聊聊吧!

    面簡單介紹了C#的基礎(chǔ)知識,由于剛子是半路出家,所以一直以來都養(yǎng)成了不太注重死記硬背基礎(chǔ)知識,而是提倡在別人代碼基礎(chǔ)上修改。所以今天我們也采用這樣的方式來試一下串口通訊。

    首先要準(zhǔn)備一些軟件工具:虛擬串口、串口助手。在電腦上安裝好虛擬串口軟件,然后新建一對虛擬串口。

    這一對虛擬串口創(chuàng)建好后,已經(jīng)被軟件內(nèi)部聯(lián)通了。這意味著你從串口1發(fā)出的數(shù)據(jù),在串口2就能收到,從串口2發(fā)出的數(shù)據(jù),從串口1就能收到,這樣就完成了串口雙向通訊。我們要做的就是學(xué)習(xí)如何接收和發(fā)送數(shù)據(jù)。


    在自己編程序之前,先打開串口助手,試試兩個串口是否正確聯(lián)通了。串口在數(shù)據(jù)傳輸過程中,兩邊的協(xié)議需要一致。所以要確認(rèn)兩側(cè)的波特率、奇偶校驗位、數(shù)據(jù)位、停止位等參數(shù)一致,這樣才能正常的進(jìn)行數(shù)據(jù)發(fā)送和解析。

    先建立一個項目,然后創(chuàng)建一個窗體,在窗體上按圖示建立打開串口按鈕、發(fā)送按鈕、接收數(shù)據(jù)文本框、發(fā)送數(shù)據(jù)文本框、串口列表框。之后雙擊打開串口按鈕,進(jìn)入源代碼編輯界面,然后添加 引用:using System.IO; using System.IO.Ports;

    之后在按鈕的源代碼中填入以下代碼:private SerialPort serialPort1=new SerialPort();


    這時候我們會發(fā)現(xiàn)編譯器報錯了。這是因為我們沒有引用 SerialPort 控件,不必氣餒,自行添加一下。菜單欄找到: 工具–>Nuget包管理器(N)–>管理解決方案的Nuget程序包(N)

    點擊管理解決方案的Nuget程序包(N),在打開的界面中選擇:瀏覽,并輸入“Serial Port“ 回車后,列表中找到 System.IO.Ports ,選中右邊的項目(我的是Port), 你自己的可能不同,點擊安裝安裝該模塊,

    在彈出的框中點擊確定,安裝完成后錯誤消失。

    雙擊窗體,在源代碼中輸入下方代碼:

    private void Form1_Load(object sender, EventArgs e)

    {

    string[] ports=SerialPort.GetPortNames();

    foreach (string port in ports)

    {

    comboBox1.Items.Add(port);

    }

    comboBox1.SelectedIndex=0;

    }

    這樣我們在窗體加載時就獲取了本電腦上所有可用的串口列表。


    雙擊打開串口按鈕,添加以下代碼:

    serialPort1.PortName=comboBox1.Text;

    serialPort1.BaudRate=9600;

    serialPort1.DataBits=8;

    serialPort1.Parity=Parity.None;

    serialPort1.StopBits=StopBits.One;

    serialPort1.DataReceived +=SerialPort1_DataReceived;

    serialPort1.Open();


    雙擊發(fā)送按鈕,添加以下代碼:

    serialPort1.WriteLine(textBox1.Text);

    MessageBox.Show("數(shù)據(jù)發(fā)送成功!", "系統(tǒng)提示");


    這樣我們就完成了發(fā)送部分代碼的編寫,可以運(yùn)行一下試試了。

    從圖上可以看到,我們成功發(fā)將數(shù)據(jù)從C#編寫的窗口發(fā)送到了串口助手。

    今天就到這里,我們后面再講如何用串口接受數(shù)據(jù),希望大家持續(xù)關(guān)注。

網(wǎng)站首頁   |    關(guān)于我們   |    公司新聞   |    產(chǎn)品方案   |    用戶案例   |    售后服務(wù)   |    合作伙伴   |    人才招聘   |   

友情鏈接: 餐飲加盟

地址:北京市海淀區(qū)    電話:010-     郵箱:@126.com

備案號:冀ICP備2024067069號-3 北京科技有限公司版權(quán)所有