欧美vvv,亚洲第一成人在线,亚洲成人欧美日韩在线观看,日本猛少妇猛色XXXXX猛叫

新聞資訊

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

    什么是波特率、比特率?

    比特率(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,比如:

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

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

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

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

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

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

    串口參數-COMMIX軟件

    串口定義

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

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

    串口的應用

    數據格式

    串口的數據格式為停止位,校驗位,數據位和起始位。

    數據幀格式

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

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

    數據0x55傳輸過程

    波特率

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

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

    校驗位

    對可靠性要求非??量痰脑O備都會帶上校驗位,來驗證傳輸的數據是否正常;如果傳輸出錯了會重新發送或者做對應處理;分別有如下幾種校驗方式:

    1:even-每個字節傳送整個過程中bit為1的個數是偶數

    2:odd 每個字節傳送整個過程中bit為1的個數是奇數

    3:noparity 沒有校驗位

    4:space 校驗位總為0

    5:mark 校驗位總為1

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

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

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

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

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

    這一對虛擬串口創建好后,已經被軟件內部聯通了。這意味著你從串口1發出的數據,在串口2就能收到,從串口2發出的數據,從串口1就能收到,這樣就完成了串口雙向通訊。我們要做的就是學習如何接收和發送數據。


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

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

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


    這時候我們會發現編譯器報錯了。這是因為我們沒有引用 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();


    雙擊發送按鈕,添加以下代碼:

    serialPort1.WriteLine(textBox1.Text);

    MessageBox.Show("數據發送成功!", "系統提示");


    這樣我們就完成了發送部分代碼的編寫,可以運行一下試試了。

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

    今天就到這里,我們后面再講如何用串口接受數據,希望大家持續關注。

網站首頁   |    關于我們   |    公司新聞   |    產品方案   |    用戶案例   |    售后服務   |    合作伙伴   |    人才招聘   |   

友情鏈接: 餐飲加盟

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

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