91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

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

電子設(shè)計(jì) ? 來源:電子設(shè)計(jì) ? 作者:電子設(shè)計(jì) ? 2020-12-15 00:14 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

首發(fā):嵌入式客棧
作者:逸珺

導(dǎo)讀

單片機(jī)開發(fā)串口是應(yīng)用最為廣泛的通信接口,也是最為簡(jiǎn)單的通信接口之一,但是其中的一些要點(diǎn)你是否明了呢?來看看本人對(duì)串口的一些總結(jié),當(dāng)然這個(gè)總結(jié)并不能面面俱到,只是將個(gè)人認(rèn)為具有共性以及相對(duì)比較重要的點(diǎn)做了些梳理。

啥是串口?

首先這玩意兒分兩種:

通用異步收發(fā)器(UART) 是用于異步串行通信的一種物理層標(biāo)準(zhǔn),其中數(shù)據(jù)格式和傳輸速度是可配置的。

通用同步收發(fā)器(USART)是一種串行接口設(shè)備,可以對(duì)其進(jìn)行編程以進(jìn)行異步同步通信。

數(shù)據(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):

一個(gè)有效字節(jié)的傳輸時(shí)間怎么算?

位數(shù)波特率

比如 9600 下,1 位起始位,8 位數(shù)據(jù)位,奇校驗(yàn),1 位停止位,則

為什么要理解清楚這個(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è)有干擾的場(chǎng)景下,校驗(yàn)位就可以從物理層檢測(cè)出錯(cuò)誤。

理解數(shù)據(jù)編碼方式有啥意義呢?比如在調(diào)試中你可以利用邏輯分析直接去解析收發(fā)線上的數(shù)據(jù)報(bào)文。

應(yīng)用電路設(shè)計(jì)的時(shí)候 RX-TX 相連,很多初學(xué)者容易在這里踩坑!

常見的傳輸位序?yàn)榈陀行辉谇啊?/p>

對(duì)于波特率而言需要注意波特率發(fā)生器有可能帶來誤碼問題

啥是 UART?

兩邊分別代表兩個(gè)通信的設(shè)備,單從 UART 編程的角度講收發(fā)不需要物理同步握手,想發(fā)就發(fā)。箭頭代表數(shù)據(jù)信息流向。RX 表示接收數(shù)據(jù),TX 表示發(fā)送數(shù)據(jù)。數(shù)據(jù)總是從發(fā)送端傳遞到接收端,這就是為啥 RX 連接 TX,TX 連 RX 的原因。

啥是 USART?

同步簡(jiǎn)單說,收發(fā)不可自如,不可以想發(fā)就發(fā),收發(fā)需要利用硬件 IO 口進(jìn)行握手,RTS/CTS 就是用于同步的握手信號(hào)

RTS:Ready to send,請(qǐng)求發(fā)送,用于在當(dāng)前傳輸結(jié)束時(shí)阻止數(shù)據(jù)發(fā)送。

CTS:clear to send,清除發(fā)送,用于指示 USART 已準(zhǔn)備好接收數(shù)據(jù)。

這個(gè)對(duì)于普通應(yīng)用而言并不常見,這里不做詳細(xì)展開,需要用到的時(shí)候只需要對(duì)應(yīng)收發(fā)時(shí)控制握手信號(hào)即可。

編程策略

對(duì)于不同的單片機(jī),其硬件體系各異,寄存器也差異很大,但是從收發(fā)編程策略角度而言,常見有下面三種方式:

查詢發(fā)送/中斷接收模式

收發(fā)中斷模式

DMA 模式

查詢發(fā)送/中斷接收模式

這里以偽代碼方式描述一下:

/*查詢發(fā)送字節(jié)*/  
voiduart_send_byte(uint8ch)  
{  
/*如果當(dāng)前串口狀態(tài)寄存器非空閑,則一直等待*/  
/*注意while循環(huán)后的分號(hào),表示循環(huán)體為空操作*/  
while(!UART_IS_IDLE());  
  
/*此時(shí)將發(fā)送字節(jié)寫入發(fā)送寄存器*/  
UART_TX_REG=ch;  
}  
  
/*發(fā)送一個(gè)緩沖區(qū)*/  
voiduart_send_buffer(uint8*pBuf,uint8size)  
{  
uint8i=0;  
/*異常參數(shù)處理*/  
if(pBuf==NULL)  
return;  
  
for(i=0;i

對(duì)于接收而言,如采用查詢模式則幾乎是沒有任何應(yīng)用價(jià)值,因?yàn)橥獠繑?shù)據(jù)不知道什么時(shí)候會(huì)到來,所以查詢接受就不描述了,這里描述一下中斷接收。

staticuint8rx_index=0;  
voiduart_rx_isr(void)  
{  
/*接收?qǐng)?bào)文處理*/  
rx_buffer[rx_index++]=UART_RX_REG;  
}  

中斷接收需要考慮的幾個(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)境對(duì)于中斷向量的處理方式略有不同,需要根據(jù)各自芯片的特點(diǎn)進(jìn)行處理。比如 51 單片機(jī),其發(fā)送/接收都共享一個(gè)中斷向量號(hào)。

收發(fā)中斷模式

#defineFRAME_SIZE(128u)  
staticuint8tx_buffer[FRAME_SIZE];  
staticuint8tx_index=0;  
staticuint8tx_length=0;  
  
staticuint8rx_buffer[FRAME_SIZE];  
staticuint8rx_index=0;  
staticboolrx_frame_done=false;  
voidprepare_frame(uint8*pBuf,uint8size)  
{  
/*將待傳的報(bào)文按照協(xié)議封裝*/  
/*可能需要處理的事情,比如幀頭、幀尾、校驗(yàn)等*/  
}  
  
booluart_start_sending(uint8*pBuf,uint8size)  
{  
if(pBuf==NULL)  
returnfalse;  
  
memcpy(tx_buffer,pBuf,size);  
tx_index=0;  
tx_length=size;  
  
/*使能發(fā)送中斷,向發(fā)送寄存器寫入一個(gè)字節(jié),進(jìn)入連續(xù)發(fā)送模式*/  
ENABLE_TX_INT=1;  
UART_TX_REG=tx_buffer[tx_index++];  
}  
  
voiduart_tx_isr(void)  
{  
if(tx_index

還需要考慮的是,對(duì)于 UART 硬件層面的出錯(cuò)處置,以 STM32 為例,就可能有下面的錯(cuò)誤可能發(fā)生:

溢出錯(cuò)誤

噪聲檢測(cè)

幀錯(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ā)送長(zhǎng)度。

啟動(dòng) DMA 傳輸,剩下傳輸完成就會(huì)進(jìn)入傳輸結(jié)束中斷處理函數(shù)。

DMA 接收模式而言,大致分這樣幾步:

初始化 UART 為 DMA 接收模式,開啟 DMA 結(jié)束中斷,并寫好 DMA 傳輸結(jié)束中斷處理函數(shù)

中斷處理函數(shù)中標(biāo)記接收到幀,對(duì)于使用 RTOS 而言,還可以使用的機(jī)制是利用 RTOS 的事件機(jī)制、消息機(jī)制進(jìn)行通知有新的幀接收到了。

對(duì)于 DMA 接收模式而言,對(duì)于變長(zhǎng)幀的處理較為不利,所以如果想使用 DMA 接收,制定協(xié)議時(shí)盡量考慮將幀長(zhǎng)度固定,這樣處理會(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)是:

對(duì)于一些技術(shù)點(diǎn)盡量學(xué)會(huì)將其共性的東西剝離總結(jié)出來。

總結(jié)、概括、剝離抽象是一個(gè)比較好的學(xué)習(xí)思路,不用對(duì)具體的硬件死記,萬變不離其宗。

如果本文有喜歡的朋友,后面陸續(xù)可以總結(jié)一下I2C/SPI等常用接口。

本文辛苦原創(chuàng)分享,如果覺得有價(jià)值也請(qǐng)幫忙點(diǎn)贊/轉(zhuǎn)發(fā)支持,不勝感激!

審核編輯 黃昊宇

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 單片機(jī)
    +關(guān)注

    關(guān)注

    6077

    文章

    45506

    瀏覽量

    670980
  • 串口
    +關(guān)注

    關(guān)注

    15

    文章

    1620

    瀏覽量

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

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    11.0592MHz晶振換成12MHz后單片機(jī)串口通訊亂碼的原因分析

    真是沒想到啊,把11.0592MHz的晶振焊成了12MHz,單片機(jī)串口通訊打印全亂碼了。明明頻率差不多,為什么會(huì)導(dǎo)致通訊徹底失敗?貿(mào)澤科普實(shí)驗(yàn)室?guī)Т蠹覐?b class='flag-5'>串口亂碼開始,重新認(rèn)識(shí)晶振。
    的頭像 發(fā)表于 03-06 09:22 ?4447次閱讀
    11.0592MHz晶振換成12MHz后<b class='flag-5'>單片機(jī)</b><b class='flag-5'>串口</b>通訊亂碼的原因分析

    MCU單片機(jī)串口數(shù)據(jù)記錄儀方案

    在工業(yè)控制、環(huán)境監(jiān)測(cè)、物流追蹤等眾多領(lǐng)域,如何可靠、便捷地記錄設(shè)備串口數(shù)據(jù)成為不少工程師關(guān)注的焦點(diǎn)?;贛CU單片機(jī)串口數(shù)據(jù)記錄儀方案,正以其高效集成、靈活存儲(chǔ)和簡(jiǎn)便操作的特點(diǎn),成為數(shù)據(jù)采集與記錄場(chǎng)景中的理想選擇。
    的頭像 發(fā)表于 11-27 15:02 ?344次閱讀

    單片機(jī)燒錄原理是怎樣的?輝芒微單片機(jī)燒錄程序詳細(xì)步驟講解

    燒錄(Programming)就是把 .hex/.bin 文件里的機(jī)器碼搬運(yùn)進(jìn)單片機(jī)片內(nèi) Flash 的過程。輝芒微(FMD)單片機(jī)內(nèi)部有一塊 自舉 BootROM,上電時(shí)會(huì)先跑這段程序;如果檢測(cè)
    的頭像 發(fā)表于 09-17 16:14 ?2425次閱讀
    <b class='flag-5'>單片機(jī)</b>燒錄原理是怎樣的?輝芒微<b class='flag-5'>單片機(jī)</b>燒錄程序詳細(xì)步驟講解

    單片機(jī)板跟上位機(jī)進(jìn)行串口發(fā)收數(shù)據(jù)時(shí),每次上位機(jī)下發(fā)指令,為什么?

    單片機(jī)板跟上位機(jī)進(jìn)行串口發(fā)收數(shù)據(jù)時(shí),每次上位機(jī)下發(fā)指令,出現(xiàn)問題都是在第一條指令后,有時(shí)在單片機(jī)回發(fā)完數(shù)據(jù)后偷發(fā)0x00,怎么解?
    發(fā)表于 08-08 08:20

    什么單片機(jī)比較耐用

    ? ? ? ? 在工業(yè)控制、戶外設(shè)備、醫(yī)療儀器等場(chǎng)景中,單片機(jī)的耐用性直接決定了設(shè)備的穩(wěn)定運(yùn)行與維護(hù)成本。耐用的單片機(jī)通常具備寬溫工作范圍、強(qiáng)抗干擾能力、穩(wěn)定的電源適應(yīng)性和長(zhǎng)壽命的硬件設(shè)計(jì)。深圳市安
    的頭像 發(fā)表于 07-31 13:48 ?794次閱讀

    單片機(jī)的儲(chǔ)存優(yōu)點(diǎn)是什么

    單片機(jī)作為嵌入式系統(tǒng)的核心,儲(chǔ)存系統(tǒng)是實(shí)現(xiàn)數(shù)據(jù)存儲(chǔ)與程序運(yùn)行的關(guān)鍵部分。與獨(dú)立存儲(chǔ)芯片相比,單片機(jī)的儲(chǔ)存單元在集成度、功耗、可靠性等方面具備獨(dú)特優(yōu)勢(shì),這些優(yōu)點(diǎn)使其能適應(yīng)從消費(fèi)電子到工業(yè)控制的多樣化
    的頭像 發(fā)表于 07-31 10:09 ?712次閱讀

    單片機(jī)采用什么電流控制

    單片機(jī)作為電子系統(tǒng)的控制核心,電流控制涉及自身工作電流管理與外部設(shè)備電流驅(qū)動(dòng)兩個(gè)層面。由于單片機(jī)內(nèi)部電路的特性,自身工作電流較小,而控制外部設(shè)備時(shí)需通過特定電路實(shí)現(xiàn)電流放大與調(diào)節(jié),
    的頭像 發(fā)表于 07-30 10:07 ?758次閱讀

    怎么測(cè)單片機(jī)系統(tǒng)頻率

    ,各有特點(diǎn)和操作要點(diǎn)。 示波器測(cè)量法 示波器是測(cè)量單片機(jī)系統(tǒng)頻率的常用工具,原理是通過捕捉單片機(jī)輸出的周期性信號(hào),根據(jù)信號(hào)的周期計(jì)算頻率。 操作步驟 首先,確定
    的頭像 發(fā)表于 07-25 11:39 ?836次閱讀

    單片機(jī)怎么驅(qū)動(dòng)電機(jī)?

    在各類自動(dòng)化設(shè)備和智能裝置中,電機(jī)是重要的執(zhí)行部件,而單片機(jī)作為控制核心,需要通過特定的方式驅(qū)動(dòng)電機(jī)運(yùn)轉(zhuǎn)。單片機(jī)驅(qū)動(dòng)電機(jī)并非直接連接即可,而是要根據(jù)電機(jī)類型和功率,搭配合適的驅(qū)動(dòng)電路,才能實(shí)現(xiàn)穩(wěn)定
    的頭像 發(fā)表于 07-25 09:31 ?964次閱讀

    單片機(jī)怎么燒程序

    單片機(jī)燒程序是將編寫好的程序代碼寫入單片機(jī)內(nèi)部存儲(chǔ)單元,讓單片機(jī)按照預(yù)設(shè)邏輯工作的過程,是單片機(jī)應(yīng)用開發(fā)中不可或缺的環(huán)節(jié)。無論是簡(jiǎn)單的燈光控制程序,還是復(fù)雜的工業(yè)控制算法,都需要通過燒
    的頭像 發(fā)表于 07-23 11:47 ?1403次閱讀

    單片機(jī)直流電機(jī)調(diào)速原理

    在工業(yè)自動(dòng)化、智能設(shè)備等領(lǐng)域,直流電機(jī)的調(diào)速控制至關(guān)重要,而單片機(jī)憑借靈活的控制能力,成為實(shí)現(xiàn)直流電機(jī)精準(zhǔn)調(diào)速的核心部件。單片機(jī)直流電機(jī)調(diào)速技術(shù)通過程序控制,能讓電機(jī)在不同工況下保持穩(wěn)定的轉(zhuǎn)速
    的頭像 發(fā)表于 07-17 13:42 ?755次閱讀

    單片機(jī)定制開發(fā)的設(shè)計(jì)思路

    單片機(jī)定制開發(fā)是根據(jù)特定場(chǎng)景和功能需求,量身打造符合要求的單片機(jī)應(yīng)用方案,設(shè)計(jì)過程需要兼顧技術(shù)可行性與實(shí)際應(yīng)用價(jià)值,涉及多個(gè)關(guān)鍵環(huán)節(jié)。 一、需求分析階段 單片機(jī)定制開發(fā)的第一步是深入
    的頭像 發(fā)表于 07-17 11:14 ?800次閱讀
    <b class='flag-5'>單片機(jī)</b>定制開發(fā)的設(shè)計(jì)思路

    使用USB轉(zhuǎn)TTL串口板和ST-LINK調(diào)試下載器給STM32單片機(jī)下載程序

    本文詳細(xì)介紹如何使用ST-LINK/V2和USB轉(zhuǎn)TTL串口板為STM32單片機(jī)下載程序,包括STM32啟動(dòng)模式、JTAG與SWD接口對(duì)比、驅(qū)動(dòng)安裝及官方軟件STM32ST-LINKUtility和FlashLoaderDemonstrator的操作流程。
    的頭像 發(fā)表于 06-20 17:26 ?2805次閱讀
    使用USB轉(zhuǎn)TTL<b class='flag-5'>串口</b>板和ST-LINK調(diào)試下載器給STM32<b class='flag-5'>單片機(jī)</b>下載程序

    單片機(jī)科普總結(jié),建議收藏!

    單片機(jī)(MicrocontrollerUnit,MCU)作為嵌入式系統(tǒng)的核心之一,在現(xiàn)代電子產(chǎn)品中無處不在。從智能家居、汽車電子,到工業(yè)控制、醫(yī)療設(shè)備,單片機(jī)支撐著無數(shù)智能化應(yīng)用的發(fā)展。對(duì)于初學(xué)者
    的頭像 發(fā)表于 04-07 11:58 ?5833次閱讀
    <b class='flag-5'>單片機(jī)</b>科普總結(jié),建議收藏!

    瑞薩Cortext-M85內(nèi)核RA8系列單片機(jī)串口輸出實(shí)現(xiàn)方法

    串口是最常見的通信方式之一,也是單片機(jī)調(diào)試最常見的通信接口,也是現(xiàn)在的單片機(jī)必備的通信接口,目前(2024-05)最新、最強(qiáng)的Cortext-M85內(nèi)核的RA8系列單片機(jī)也不例外。
    的頭像 發(fā)表于 03-21 09:58 ?1895次閱讀
    瑞薩Cortext-M85內(nèi)核RA8系列<b class='flag-5'>單片機(jī)</b>的<b class='flag-5'>串口</b>輸出實(shí)現(xiàn)方法