你的位置:首頁 > 測試測量 > 正文

萬變不離其宗之單片機(jī)串口共性問題

發(fā)布時(shí)間:2020-07-22 責(zé)任編輯:lina

【導(dǎo)讀】單片機(jī)開發(fā)串口是應(yīng)用最為廣泛的通信接口,也是最為簡單的通信接口之一,但是其中的一些要點(diǎn)你是否明了呢?來看看本人對串口的一些總結(jié),當(dāng)然這個(gè)總結(jié)并不能面面俱到,只是將個(gè)人認(rèn)為具有共性以及相對比較重要的點(diǎn)做了些梳理。
    
啥是串口?
 
首先這玩意兒分兩種:
●通用異步收發(fā)器(UART)是用于異步串行通信的一種物理層標(biāo)準(zhǔn),其中數(shù)據(jù)格式和傳輸速度是可配置的。
●通用同步收發(fā)器(USART)是一種串行接口設(shè)備,可以對其進(jìn)行編程以進(jìn)行異步或同步通信。
 
數(shù)據(jù)格式
 
萬變不離其宗之單片機(jī)串口共性問題
 
線上空閑、無數(shù)據(jù)狀態(tài)為常高電平,故邏輯低定義為起始位。
●起始位:總是 1 位
●數(shù)據(jù)位:常見的有 8 位或 9 位。
      校驗(yàn)位
      奇校驗(yàn)
      偶校驗(yàn)
無校驗(yàn)
●停止位:
      1 位
      2 位
●波特率:bit rate 就是位/秒的概念,就是 1 秒傳送多少位的概念。常見的波特率有哪些呢?
 
這里須注意的要點(diǎn):
 
萬變不離其宗之單片機(jī)串口共性問題
 
一個(gè)有效字節(jié)的傳輸時(shí)間怎么算?
 
萬變不離其宗之單片機(jī)串口共性問題
 
比如 9600 下,1 位起始位,8 位數(shù)據(jù)位,奇校驗(yàn),1 位停止位,則
 
萬變不離其宗之單片機(jī)串口共性問題
 
為什么要理解清楚這個(gè)概念呢,因?yàn)樵趹?yīng)用中需要計(jì)算數(shù)據(jù)吞吐率問題,就比如一個(gè)應(yīng)用是數(shù)據(jù)采集串口傳輸問題,需要計(jì)算采集的位速率需要小于或等于傳輸波特率,否則數(shù)據(jù)就來不及傳。當(dāng)然如果說你有足夠大的緩沖區(qū)可以臨時(shí)存儲(chǔ),但是如果進(jìn)來太快,而傳出速度跟不上,多大的緩沖都會(huì)滿!
●校驗(yàn)位有用嗎?當(dāng)你的傳輸介質(zhì)處于一個(gè)有干擾的場景下,校驗(yàn)位就可以從物理層檢測出錯(cuò)誤。
●理解數(shù)據(jù)編碼方式有啥意義呢?比如在調(diào)試中你可以利用邏輯分析直接去解析收發(fā)線上的數(shù)據(jù)報(bào)文。
●應(yīng)用電路設(shè)計(jì)的時(shí)候 RX-TX 相連,很多初學(xué)者容易在這里踩坑!
●常見的傳輸位序?yàn)榈陀行辉谇啊?/div>
●對于波特率而言需要注意波特率發(fā)生器有可能帶來誤碼問題
 
啥是 UART?
 
萬變不離其宗之單片機(jī)串口共性問題
 
兩邊分別代表兩個(gè)通信的設(shè)備,單從 UART 編程的角度講收發(fā)不需要物理同步握手,想發(fā)就發(fā)。圖中箭頭代表數(shù)據(jù)信息流向。RX 表示接收數(shù)據(jù),TX 表示發(fā)送數(shù)據(jù)。數(shù)據(jù)總是從發(fā)送端傳遞到接收端,這就是為啥 RX 連接 TX,TX 連 RX 的原因。
 
啥是 USART?
 
萬變不離其宗之單片機(jī)串口共性問題
 
同步簡單說,收發(fā)不可自如,不可以想發(fā)就發(fā),收發(fā)需要利用硬件 IO 口進(jìn)行握手,RTS/CTS 就是用于同步的握手信號(hào):
●RTS:Ready to send,請求發(fā)送,用于在當(dāng)前傳輸結(jié)束時(shí)阻止數(shù)據(jù)發(fā)送。
●CTS:clear to send,清除發(fā)送,用于指示 USART 已準(zhǔn)備好接收數(shù)據(jù)。
 
這個(gè)對于普通應(yīng)用而言并不常見,這里不做詳細(xì)展開,需要用到的時(shí)候只需要對應(yīng)收發(fā)時(shí)控制握手信號(hào)即可。
 
編程策略
 
對于不同的單片機(jī),其硬件體系各異,寄存器也差異很大,但是從收發(fā)編程策略角度而言,常見有下面三種方式:
●查詢發(fā)送/中斷接收模式
●收發(fā)中斷模式
●DMA 模式
 
查詢發(fā)送/中斷接收模式
 
這里以偽代碼方式描述一下:
 
萬變不離其宗之單片機(jī)串口共性問題
 
對于接收而言,如采用查詢模式則幾乎是沒有任何應(yīng)用價(jià)值,因?yàn)橥獠繑?shù)據(jù)不知道什么時(shí)候會(huì)到來,所以查詢接受就不描述了,這里描述一下中斷接收。
 
萬變不離其宗之單片機(jī)串口共性問題
 
中斷接收需要考慮的幾個(gè)要點(diǎn):
●斷幀:這就取決于協(xié)議怎么制定了,比如應(yīng)用協(xié)議定義的是 ASCII 碼方式,就可以定義同步頭、同步尾,比如 AT 指令的解析,做邏輯判斷幀頭、幀尾即可。但是如果傳輸?shù)氖?16 進(jìn)制數(shù)據(jù),比如 MODBUS-RTU 其斷幀采用的是 3.5 個(gè)字節(jié)時(shí)間沒有新的字節(jié)接收到,則認(rèn)為收到完整的幀了。
●如何保證幀的完整性,一般會(huì)在報(bào)文尾部加校驗(yàn),比較常用的校驗(yàn)?zāi)J接?CRC 校驗(yàn)算法。
●不同的單片機(jī)開發(fā)環(huán)境對于中斷向量的處理方式略有不同,需要根據(jù)各自芯片的特點(diǎn)進(jìn)行處理。比如 51 單片機(jī),其發(fā)送/接收都共享一個(gè)中斷向量號(hào)。
 
收發(fā)中斷模式
 
萬變不離其宗之單片機(jī)串口共性問題
 
還需要考慮的是,對于 UART 硬件層面的出錯(cuò)處置,以 STM32 為例,就可能有下面的錯(cuò)誤可能發(fā)生:
 
●溢出錯(cuò)誤
●噪聲檢測
●幀錯(cuò)誤
●奇偶校驗(yàn)錯(cuò)誤
 
另外不同的單片機(jī)其底層硬件實(shí)現(xiàn)差異也不較大,比如有的硬件發(fā)送緩沖是單字節(jié)的緩沖,有的則具有 FIFO,這些在選型編程時(shí)都需要綜合考慮。
 
DMA 模式
 
DMA 發(fā)送模式而言,大致分這樣幾步:
●初始化 UART 為 DMA 發(fā)送模式,開啟 DMA 結(jié)束中斷,并寫好 DMA 傳輸結(jié)束中斷處理函數(shù)
●準(zhǔn)備待發(fā)送報(bào)文,幀頭、幀尾、校驗(yàn)處理
●將待發(fā)送報(bào)文緩沖區(qū)首地址賦值給 DMA 源地址,DMA 目標(biāo)地址設(shè)置為 UART 發(fā)送寄存器,設(shè)置好發(fā)送長度。
●啟動(dòng) DMA 傳輸,剩下傳輸完成就會(huì)進(jìn)入傳輸結(jié)束中斷處理函數(shù)。
●DMA 接收模式而言,大致分這樣幾步:
●初始化 UART 為 DMA 接收模式,開啟 DMA 結(jié)束中斷,并寫好 DMA 傳輸結(jié)束中斷處理函數(shù)
中斷處理函數(shù)中標(biāo)記接收到幀,對于使用 RTOS 而言,還可以使用的機(jī)制是利用 RTOS 的事件機(jī)制、消息機(jī)●制進(jìn)行通知有新的幀接收到了。
●對于 DMA 接收模式而言,對于變長幀的處理較為不利,所以如果想使用 DMA 接收,制定協(xié)議時(shí)盡量考慮將幀長度固定,這樣處理會(huì)方便些。
 
總結(jié)一下
 
單片機(jī)串口是一個(gè)需要好好掌握的內(nèi)容,這里總結(jié)了一些個(gè)人經(jīng)驗(yàn),盡量將一些個(gè)人共性的東西總結(jié)出來。至于實(shí)際實(shí)現(xiàn)而言,由于芯片體系差異較多,具體代碼各異。但個(gè)人認(rèn)為處置的思路方法卻是基本一致。所以本文除了描述串口本身的細(xì)節(jié)而言,想表達(dá)的一個(gè)額外的觀點(diǎn)是:
 
對于一些技術(shù)點(diǎn)盡量學(xué)會(huì)將其共性的東西剝離總結(jié)出來。
總結(jié)、概括、剝離抽象是一個(gè)比較好的學(xué)習(xí)思路,不用對具體的硬件死記,萬變不離其宗。
如果本文有喜歡的朋友,后面陸續(xù)可以總結(jié)一下I2C/SPI等常用接口。
 
免責(zé)聲明:本文為轉(zhuǎn)載文章,轉(zhuǎn)載此文目的在于傳遞更多信息,版權(quán)歸原作者所有。本文所用視頻、圖片、文字如涉及作品版權(quán)問題,請電話或者郵箱聯(lián)系小編進(jìn)行處理。
 
 
特別推薦
技術(shù)文章更多>>
技術(shù)白皮書下載更多>>
熱門搜索
?

關(guān)閉

?

關(guān)閉