小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

單片機(jī)串口共性問(wèn)題

 啟云_9137 2020-07-08

以下文章來(lái)源于嵌入式客棧 ,作者逸珺。

部分修改,

單片機(jī)串口共性問(wèn)題

串口分類(串口是啥)

  • 通用異步收發(fā)器(UART)是用于異步串行通信的一種物理層標(biāo)準(zhǔn),其中數(shù)據(jù)格式和傳輸速度是可配置的。
  • 通用同步收發(fā)器(USART)是一種串行接口設(shè)備,可以對(duì)其進(jìn)行編程以進(jìn)行異步同步通信。
  • 單片機(jī)串口共性問(wèn)題

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

    線上空閑、無(wú)數(shù)據(jù)狀態(tài)為常高電平,故邏輯低定義為起始位。

    • 起始位:總是 1 位
    • 數(shù)據(jù)位:常見(jiàn)的有 8 位或 9 位。
    • 校驗(yàn)位
      • 奇校驗(yàn)
      • 偶校驗(yàn)
      • 無(wú)校驗(yàn)
    • 停止位:
      • 1 位
      • 2 位
    • 波特率:bit rate 就是位/秒的概念,就是 1 秒傳送多少位的概念。

    常見(jiàn)的波特率有哪些呢?如下圖:

    單片機(jī)串口共性問(wèn)題

    注意:

  • 應(yīng)用電路設(shè)計(jì)的時(shí)候 RX-TX 相信,很多初學(xué)者容易在這里踩坑!
  • 常見(jiàn)的傳輸位序?yàn)榈陀行辉谇啊?/li>
  • 對(duì)于波特率而言需要注意波特率發(fā)生器有可能帶來(lái)誤碼問(wèn)題
  • 一個(gè)有效字節(jié)的傳輸時(shí)間算法

    單片機(jī)串口共性問(wèn)題

    計(jì)算公式

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

    單片機(jī)串口共性問(wèn)題

    校驗(yàn)位有用嗎?

    當(dāng)你的傳輸介質(zhì)處于一個(gè)有干擾的場(chǎng)景下,校驗(yàn)位就可以從物理層檢測(cè)出錯(cuò)誤。

    理解數(shù)據(jù)編碼方式有啥意義呢?

    比如在調(diào)試中你可以利用邏輯分析直接去解析收發(fā)線上的數(shù)據(jù)報(bào)文。

    啥是UART?啥是USART?

    單片機(jī)串口共性問(wèn)題

    UART

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

    單片機(jī)串口共性問(wèn)題

    同步簡(jiǎn)單說(shuō),收發(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)用而言并不常見(jiàn),這里不做詳細(xì)展開(kāi),需要用到的時(shí)候只需要對(duì)應(yīng)收發(fā)時(shí)控制握手信號(hào)即可。

    編程策略

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

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

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

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

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

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

    static uint8 rx_index = 0;void uart_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í)間沒(méi)有新的字節(jié)接收到,則認(rèn)為收到完整的幀了。
    • 如何保證幀的完整性,一般會(huì)在報(bào)文尾部加校驗(yàn),比較常用的校驗(yàn)?zāi)J接?CRC 校驗(yàn)算法。
    • 不同的單片機(jī)開(kāi)發(fā)環(huán)境對(duì)于中斷向量的處理方式略有不同,需要根據(jù)各自芯片的特點(diǎn)進(jìn)行處理。比如 51 單片機(jī),其發(fā)送/接收都共享一個(gè)中斷向量號(hào)。

    收發(fā)中斷模式

    #define FRAME_SIZE (128u)static uint8 tx_buffer[FRAME_SIZE];static uint8 tx_index = 0;static uint8 tx_length = 0;static uint8 rx_buffer[FRAME_SIZE];static uint8 rx_index = 0;static bool rx_frame_done = false;void prepare_frame( uint8 * pBuf, uint8 size ){ /*將待傳的報(bào)文按照協(xié)議封裝*/ /*可能需要處理的事情,比如幀頭、幀尾、校驗(yàn)等*/}bool uart_start_sending( uint8 * pBuf, uint8 size ){ if( pBuf == NULL ) return false; memcpy( tx_buffer,pBuf,size ); tx_index = 0; tx_length = size; /*使能發(fā)送中斷,向發(fā)送寄存器寫(xiě)入一個(gè)字節(jié),進(jìn)入連續(xù)發(fā)送模式*/ ENABLE_TX_INT = 1; UART_TX_REG = tx_buffer[tx_index++];}void uart_tx_isr( void ){ if( tx_index<tx_length ) { UART_TX_REG = tx_buffer[tx_index++]; } else { /*發(fā)送完畢,關(guān)閉發(fā)送中斷*/ DISABLE_TX_INT = 1; }}void uart_rx_isr( void ){ /*處理接收,待接收到完整的幀就設(shè)置幀完成標(biāo)記*/ /*由于應(yīng)用各有不同,這里就無(wú)法描述實(shí)現(xiàn)了*/}

    還需要考慮的是,對(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ā)送模式,開(kāi)啟 DMA 結(jié)束中斷,并寫(xiě)好 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 接收模式,開(kāi)啟 DMA 結(jié)束中斷,并寫(xiě)好 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ì)方便些。

      本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
      轉(zhuǎn)藏 分享 獻(xiàn)花(0

      0條評(píng)論

      發(fā)表

      請(qǐng)遵守用戶 評(píng)論公約

      類似文章 更多