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

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

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

如何有效地使用串口通訊接收數(shù)據(jù)

汽車電子技術(shù) ? 來源:物聯(lián)網(wǎng)IoT開發(fā) ? 作者:杰杰 ? 2023-02-14 09:50 ? 次閱讀

引言

在使用stm32或者其他單片機的時候,會經(jīng)常使用到串口通訊,那么如何有效地接收數(shù)據(jù)呢?假如這段數(shù)據(jù)是不定長的有如何高效接收呢?

同學(xué)A:數(shù)據(jù)來了就會進入串口中斷,在中斷中讀取數(shù)據(jù)就行了!

中斷就是打斷程序正常運行,怎么能保證高效呢?經(jīng)常把主程序打斷,主程序還要不要運行了?

同學(xué)B:串口可以配置成用DMA的方式接收數(shù)據(jù),等接收完畢就可以去讀取了!

這個同學(xué)是對的,我們可以使用DMA去接收數(shù)據(jù),不過DMA需要定長才能產(chǎn)生接收中斷,如何接收不定長的數(shù)據(jù)呢?

DMA簡介

題外話:其實,上面的問題是很有必要思考一下的,不斷思考,才能進步。

什么是DMA

DMA :全稱Direct Memory Access,即直接存儲器訪問

DMA 傳輸將數(shù)據(jù)從一個地址空間復(fù)制到另外一個地址空間。CPU只需初始化DMA即可,傳輸動作本身是由 DMA 控制器來實現(xiàn)和完成。典型的例子就是移動一個外部內(nèi)存的區(qū)塊到芯片內(nèi)部更快的內(nèi)存區(qū)。這樣的操作并沒有讓處理器參與處理,CPU可以干其他事情,當(dāng)DMA傳輸完成的時候產(chǎn)生一個中斷,告訴CPU我已經(jīng)完成了,然后CPU知道了就可以去處理數(shù)據(jù)了,這樣子提高了CPU的利用率,因為CPU是大腦,主要做數(shù)據(jù)運算的工作,而不是去搬運數(shù)據(jù)。DMA 傳輸對于高效能嵌入式系統(tǒng)算法網(wǎng)絡(luò)是很重要的。

在STM32的DMA資源

STM32F1系列MCU有兩個DMA控制器(DMA2只存在于大容量產(chǎn)品中),DMA1有7個通道,DMA2有5個通道,每個通道專門用來管理來自于一個或者多個外設(shè)對存儲器的訪問請求。還有一個仲裁器來協(xié)調(diào)各個DMA請求的優(yōu)先權(quán)。

圖片

STM32F1

圖片

STM32F1

而STM32F4/F7/H7系列的MCU有兩個DMA控制器總共有16個數(shù)據(jù)流(每個DMA控制器8個),每一個DMA控制器都用于管理一個或多個外設(shè)的存儲器訪問請求。每個數(shù)據(jù)流總共可以有多達8個通道(或稱請求)。每個通道都有一個仲裁器,用于處理 DMA 請求間的優(yōu)先級。

圖片

STM32F4

圖片

STM32F4

DMA接收數(shù)據(jù)

DMA在接收數(shù)據(jù)的時候,串口接收DMA在初始化的時候就處于開啟狀態(tài),一直等待數(shù)據(jù)的到來,在軟件上無需做任何事情,只要在初始化配置的時候設(shè)置好配置就可以了。等到接收到數(shù)據(jù)的時候,告訴CPU去處理即可。

判斷數(shù)據(jù)接收完成

那么問題來了,怎么知道數(shù)據(jù)是否接收完成呢?

其實,有很多方法:

  • 對于定長的數(shù)據(jù),只需要判斷一下數(shù)據(jù)的接收個數(shù),就知道是否接收完成,這個很簡單,暫不討論。
  • 對于不定長的數(shù)據(jù),其實也有好幾種方法,麻煩的我肯定不會介紹,有興趣做復(fù)雜工作的同學(xué)可以在網(wǎng)上看看別人怎么做,下面這種方法是最簡單的,充分利用了stm32的串口資源,效率也是非常之高。

DMA+串口空閑中斷

這兩個資源配合,簡直就是天衣無縫啊,無論接收什么不定長的數(shù)據(jù),管你數(shù)據(jù)有多少,來一個我就收一個,就像廣東人吃“山竹”,來一個吃一個~(最近風(fēng)好大,我好怕)。

可能很多人在學(xué)習(xí)stm32的時候,都不知道idle是啥東西,先看看stm32串口的狀態(tài)寄存器

圖片

idle

圖片

idle說明

當(dāng)我們檢測到觸發(fā)了串口總線空閑中斷的時候,我們就知道這一波數(shù)據(jù)傳輸完成了,然后我們就能得到這些數(shù)據(jù),去進行處理即可。這種方法是最簡單的,根本不需要我們做多的處理,只需要配置好,串口就等著數(shù)據(jù)的到來,dma也是處于工作狀態(tài)的,來一個數(shù)據(jù)就自動搬運一個數(shù)據(jù)。

接收完數(shù)據(jù)時處理

串口接收完數(shù)據(jù)是要處理的,那么處理的步驟是怎么樣呢?

  • 暫時關(guān)閉串口接收DMA通道,有兩個原因:1.防止后面又有數(shù)據(jù)接收到,產(chǎn)生干擾,因為此時的數(shù)據(jù)還未處理。2.DMA需要重新配置。
  • 清DMA標(biāo)志位。
  • 從DMA寄存器中獲取接收到的數(shù)據(jù)字節(jié)數(shù)(可有可無)。
  • 重新設(shè)置DMA下次要接收的數(shù)據(jù)字節(jié)數(shù),注意,數(shù)據(jù)傳輸數(shù)量范圍為0至65535。這個寄存器只能在通道不工作(DMA_CCRx的EN=0)時寫入。通道開啟后該寄存器變?yōu)橹蛔x,指示剩余的待傳輸字節(jié)數(shù)目。寄存器內(nèi)容在每次DMA傳輸后遞減。數(shù)據(jù)傳輸結(jié)束后,寄存器的內(nèi)容或者變?yōu)?;或者當(dāng)該通道配置為自動重加載模式時,寄存器的內(nèi)容將被自動重新加載為之前配置時的數(shù)值。當(dāng)寄存器的內(nèi)容為0時,無論通道是否開啟,都不會發(fā)生任何數(shù)據(jù)傳輸。
  • 給出信號量,發(fā)送接收到新數(shù)據(jù)標(biāo)志,供前臺程序查詢。
  • 開啟DMA通道,等待下一次的數(shù)據(jù)接收,注意,對DMA的相關(guān)寄存器配置寫入,如重置DMA接收數(shù)據(jù)長度,必須要在關(guān)閉DMA的條件進行,否則操作無效。

注意事項

STM32的IDLE的中斷在串口無數(shù)據(jù)接收的情況下,是不會一直產(chǎn)生的,產(chǎn)生的條件是這樣的,當(dāng)清除IDLE標(biāo)志位后,必須有接收到第一個數(shù)據(jù)后,才開始觸發(fā),一斷接收的數(shù)據(jù)斷流,沒有接收到數(shù)據(jù),即產(chǎn)生IDLE中斷。如果中斷發(fā)送數(shù)據(jù)幀的速率很快,MCU來不及處理此次接收到的數(shù)據(jù),中斷又發(fā)來數(shù)據(jù)的話,這里不能開啟,否則數(shù)據(jù)會被覆蓋。有兩種方式解決:

  1. 在重新開啟接收DMA通道之前,將Rx_Buf緩沖區(qū)里面的數(shù)據(jù)復(fù)制到另外一個數(shù)組中,然后再開啟DMA,然后馬上處理復(fù)制出來的數(shù)據(jù)。
  2. 建立雙緩沖,重新配置DMA_MemoryBaseAddr的緩沖區(qū)地址,那么下次接收到的數(shù)據(jù)就會保存到新的緩沖區(qū)中,不至于被覆蓋。

程序?qū)崿F(xiàn)

實驗效果:

當(dāng)外部給單片機發(fā)送數(shù) 據(jù)的時候,假設(shè)這幀數(shù)據(jù)長度是1000個字節(jié),那么在單片機接收到一個字節(jié)的時候并不會產(chǎn)生串口中斷,只是DMA在背后默默地把數(shù)據(jù)搬運到你指定的緩沖區(qū)里面。當(dāng)整幀數(shù)據(jù)發(fā)送完畢之后串口才會產(chǎn)生一次中斷,此時可以利用DMA_GetCurrDataCounter()函數(shù)計算出本次的數(shù)據(jù)接受長度,從而進行數(shù)據(jù)處理。

串口的配置

很簡單,基本與使用串口的時候一致,只不過一般我們是打開接收緩沖區(qū)非空中斷,而現(xiàn)在是打開空閑中斷——USART_ITConfig(DEBUG_USARTx, USART_IT_IDLE, ENABLE);。

/**
  * @brief  USART GPIO 配置,工作參數(shù)配置
  * @param  無
  * @retval 無
  */
void USART_Config(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;
    USART_InitTypeDef USART_InitStructure;

    // 打開串口GPIO的時鐘
    DEBUG_USART_GPIO_APBxClkCmd(DEBUG_USART_GPIO_CLK, ENABLE);

    // 打開串口外設(shè)的時鐘
    DEBUG_USART_APBxClkCmd(DEBUG_USART_CLK, ENABLE);

    // 將USART Tx的GPIO配置為推挽復(fù)用模式
    GPIO_InitStructure.GPIO_Pin = DEBUG_USART_TX_GPIO_PIN;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(DEBUG_USART_TX_GPIO_PORT, &GPIO_InitStructure);

  // 將USART Rx的GPIO配置為浮空輸入模式
    GPIO_InitStructure.GPIO_Pin = DEBUG_USART_RX_GPIO_PIN;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    GPIO_Init(DEBUG_USART_RX_GPIO_PORT, &GPIO_InitStructure);

    // 配置串口的工作參數(shù)
    // 配置波特率
    USART_InitStructure.USART_BaudRate = DEBUG_USART_BAUDRATE;
    // 配置 針數(shù)據(jù)字長
    USART_InitStructure.USART_WordLength = USART_WordLength_8b;
    // 配置停止位
    USART_InitStructure.USART_StopBits = USART_StopBits_1;
    // 配置校驗位
    USART_InitStructure.USART_Parity = USART_Parity_No ;
    // 配置硬件流控制
    USART_InitStructure.USART_HardwareFlowControl = 
    USART_HardwareFlowControl_None;
    // 配置工作模式,收發(fā)一起
    USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
    // 完成串口的初始化配置
    USART_Init(DEBUG_USARTx, &USART_InitStructure);
    // 串口中斷優(yōu)先級配置
    NVIC_Configuration();

#if USE_USART_DMA_RX 
    // 開啟 串口空閑IDEL 中斷
    USART_ITConfig(DEBUG_USARTx, USART_IT_IDLE, ENABLE);  
  // 開啟串口DMA接收
    USART_DMACmd(DEBUG_USARTx, USART_DMAReq_Rx, ENABLE); 
    /* 使能串口DMA */
    USARTx_DMA_Rx_Config();
#else
    // 使能串口接收中斷
    USART_ITConfig(DEBUG_USARTx, USART_IT_RXNE, ENABLE);    
#endif

#if USE_USART_DMA_TX 
    // 開啟串口DMA發(fā)送
//    USART_DMACmd(DEBUG_USARTx, USART_DMAReq_Tx, ENABLE); 
    USARTx_DMA_Tx_Config();
#endif

    // 使能串口
    USART_Cmd(DEBUG_USARTx, ENABLE);        
}

串口DMA配置

把DMA配置完成,就可以直接打開DMA了,讓它處于工作狀態(tài),當(dāng)有數(shù)據(jù)的時候就能直接搬運了。

#if USE_USART_DMA_RX 

static void USARTx_DMA_Rx_Config(void)
{
    DMA_InitTypeDef DMA_InitStructure;

    // 開啟DMA時鐘
    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
    // 設(shè)置DMA源地址:串口數(shù)據(jù)寄存器地址*/
    DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)USART_DR_ADDRESS;
    // 內(nèi)存地址(要傳輸?shù)淖兞康闹羔?
    DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)Usart_Rx_Buf;
    // 方向:從內(nèi)存到外設(shè)    
    DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
    // 傳輸大小 
    DMA_InitStructure.DMA_BufferSize = USART_RX_BUFF_SIZE;
    // 外設(shè)地址不增       
    DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
    // 內(nèi)存地址自增
    DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
    // 外設(shè)數(shù)據(jù)單位   
    DMA_InitStructure.DMA_PeripheralDataSize = 
    DMA_PeripheralDataSize_Byte;
    // 內(nèi)存數(shù)據(jù)單位
    DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;  
    // DMA模式,一次或者循環(huán)模式
    //DMA_InitStructure.DMA_Mode = DMA_Mode_Normal ;
    DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; 
    // 優(yōu)先級:中    
    DMA_InitStructure.DMA_Priority = DMA_Priority_VeryHigh; 
    // 禁止內(nèi)存到內(nèi)存的傳輸
    DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
    // 配置DMA通道         
    DMA_Init(USART_RX_DMA_CHANNEL, &DMA_InitStructure);     
    // 清除DMA所有標(biāo)志
    DMA_ClearFlag(DMA1_FLAG_TC5);
    DMA_ITConfig(USART_RX_DMA_CHANNEL, DMA_IT_TE, ENABLE);
    // 使能DMA
    DMA_Cmd (USART_RX_DMA_CHANNEL,ENABLE);
}
#endif

接收完數(shù)據(jù)處理

因為接收完數(shù)據(jù)之后,會產(chǎn)生一個idle中斷,也就是空閑中斷,那么我們就可以在中斷服務(wù)函數(shù)中知道已經(jīng)接收完了,就可以處理數(shù)據(jù)了,但是中斷服務(wù)函數(shù)的上下文環(huán)境是中斷,所以,盡量是快進快出,一般在中斷中將一些標(biāo)志置位,供前臺查詢。在中斷中先判斷我們的產(chǎn)生在中斷的類型是不是idle中斷,如果是則進行下一步,否則就無需理會。

/**
  ******************************************************************
  * @brief   串口中斷服務(wù)函數(shù)
  * @author  jiejie
  * @version V1.0
  * @date    2018-xx-xx
  ******************************************************************
  */ 
void DEBUG_USART_IRQHandler(void)
{
#if USE_USART_DMA_RX
    /* 使用串口DMA */
    if(USART_GetITStatus(DEBUG_USARTx,USART_IT_IDLE)!=RESET)
    {       
        /* 接收數(shù)據(jù) */
        Receive_DataPack();
        // 清除空閑中斷標(biāo)志位
        USART_ReceiveData( DEBUG_USARTx );
    }   
#else
  /* 接收中斷 */
    if(USART_GetITStatus(DEBUG_USARTx,USART_IT_RXNE)!=RESET)
    {       
    Receive_DataPack();
    }
#endif
}

Receive_DataPack()

這個才是真正的接收數(shù)據(jù)處理函數(shù),為什么我要將這個函數(shù)單獨封裝起來呢?因為這個函數(shù)其實是很重要的,因為我的代碼兼容普通串口接收與空閑中斷,不一樣的接收類型其處理也不一樣,所以直接封裝起來更好,在源碼中通過宏定義實現(xiàn)選擇接收的方式!更考慮了兼容操作系統(tǒng)的,可能我會在系統(tǒng)中使用dma+空閑中斷,所以,供前臺查詢的信號量就有可能不一樣,可能需要修改,我就把它封裝起來了。不過無所謂,都是一樣的。

/************************************************************
  * @brief   Uart_DMA_Rx_Data
  * @param   NULL
  * @return  NULL
  * @author  jiejie
  * @github  https://github.com/jiejieTop
  * @date    2018-xx-xx
  * @version v1.0
  * @note    使用串口 DMA 接收時調(diào)用的函數(shù)
  ***********************************************************/
#if USE_USART_DMA_RX
void Receive_DataPack(void)
{
    /* 接收的數(shù)據(jù)長度 */
    uint32_t buff_length;

    /* 關(guān)閉DMA ,防止干擾 */
    DMA_Cmd(USART_RX_DMA_CHANNEL, DISABLE);  /* 暫時關(guān)閉dma,數(shù)據(jù)尚未處理 */ 

    /* 清DMA標(biāo)志位 */
    DMA_ClearFlag( DMA1_FLAG_TC5 );  

    /* 獲取接收到的數(shù)據(jù)長度 單位為字節(jié)*/
    buff_length = USART_RX_BUFF_SIZE - DMA_GetCurrDataCounter(USART_RX_DMA_CHANNEL);

    /* 獲取數(shù)據(jù)長度 */
    Usart_Rx_Sta = buff_length;

    PRINT_DEBUG("buff_length = %d\\n ",buff_length);

    /* 重新賦值計數(shù)值,必須大于等于最大可能接收到的數(shù)據(jù)幀數(shù)目 */
    USART_RX_DMA_CHANNEL->CNDTR = USART_RX_BUFF_SIZE;    

    /* 此處應(yīng)該在處理完數(shù)據(jù)再打開,如在 DataPack_Process() 打開*/
    DMA_Cmd(USART_RX_DMA_CHANNEL, ENABLE);      

    /* (OS)給出信號 ,發(fā)送接收到新數(shù)據(jù)標(biāo)志,供前臺程序查詢 */

    /* 標(biāo)記接收完成,在 DataPack_Handle 處理*/
    Usart_Rx_Sta |= 0xC000;

    /* 
    DMA 開啟,等待數(shù)據(jù)。注意,如果中斷發(fā)送數(shù)據(jù)幀的速率很快,MCU來不及處理此次接收到的數(shù)據(jù),
    中斷又發(fā)來數(shù)據(jù)的話,這里不能開啟,否則數(shù)據(jù)會被覆蓋。有2種方式解決:

    1. 在重新開啟接收DMA通道之前,將Rx_Buf緩沖區(qū)里面的數(shù)據(jù)復(fù)制到另外一個數(shù)組中,
    然后再開啟DMA,然后馬上處理復(fù)制出來的數(shù)據(jù)。

    2. 建立雙緩沖,重新配置DMA_MemoryBaseAddr的緩沖區(qū)地址,那么下次接收到的數(shù)據(jù)就會
    保存到新的緩沖區(qū)中,不至于被覆蓋。
    */
}

f1使用dma是非常簡單的,我在f4用dma的時候也遇到一些問題,最后看手冊解決了,打算下一篇文章就寫一下調(diào)試過程,沒有什么是debug不能解決的,如果有,那就兩次今天臺風(fēng)天氣,連著舍友的WiFi更新的文章中國電信還是強,臺風(fēng)天氣信號一點都不虛,我的移動卡一動不動-_-.

第一次用makedown語法寫完的文章,完全沒排版 還是很好看的,嘿嘿嘿 ,在有道云筆記中寫的

圖片

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

    關(guān)注

    6030

    文章

    44489

    瀏覽量

    631968
  • STM32
    +關(guān)注

    關(guān)注

    2264

    文章

    10854

    瀏覽量

    354289
  • 串口通訊
    +關(guān)注

    關(guān)注

    1

    文章

    258

    瀏覽量

    24812
收藏 人收藏

    評論

    相關(guān)推薦

    什么是串口通訊串口通訊通訊協(xié)議技術(shù)詳解

    串行通訊是指僅用一根接收線和一根發(fā)送線就能將數(shù)據(jù)以位進行傳輸?shù)囊环N通訊方式。盡管串行通訊的比按字節(jié)傳輸?shù)牟⑿型ㄐ怕?,但?/div>
    發(fā)表于 06-09 13:01 ?3361次閱讀
    什么是<b class='flag-5'>串口</b><b class='flag-5'>通訊</b>?<b class='flag-5'>串口</b><b class='flag-5'>通訊</b>的<b class='flag-5'>通訊</b>協(xié)議技術(shù)詳解

    STM32如何有效地接收數(shù)據(jù)呢?

    STM32如何有效地接收數(shù)據(jù)呢?
    發(fā)表于 12-03 07:32

    stm32如何有效地接收數(shù)據(jù)?

    stm32如何有效地接收數(shù)據(jù)?
    發(fā)表于 12-06 07:32

    stm32串口通訊如何有效接收不定長數(shù)據(jù)

    在使用stm32或者其他單片機的時候,會經(jīng)常使用到串口通訊,那么如何有效地接收數(shù)據(jù)呢?假如這段數(shù)據(jù)
    發(fā)表于 02-18 07:51

    如何有效地接收stm32數(shù)據(jù)?

    引言在使用stm32或者其他單片機的時候,會經(jīng)常使用到串口通訊,那么如何有效地接收數(shù)據(jù)呢?假如這段數(shù)據(jù)
    發(fā)表于 02-21 06:12

    基于串口通訊的打包數(shù)據(jù)接收方案

    串口通訊是上微機與下微機通訊過程中一個較為常見的問題。本文提出了一個串口通訊中打包數(shù)據(jù)
    發(fā)表于 09-17 10:47 ?51次下載

    python串口接收數(shù)據(jù)

    本文主要介紹了python串口接收數(shù)據(jù)。其中涉及了Python使用線程來接收串口數(shù)據(jù),以及pyt
    發(fā)表于 01-15 09:52 ?4.6w次閱讀
    python<b class='flag-5'>串口</b><b class='flag-5'>接收</b><b class='flag-5'>數(shù)據(jù)</b>

    labview串口接收數(shù)據(jù)_labview串口被動接收數(shù)據(jù)

    本文主要介紹了labview串口接收數(shù)據(jù)以及l(fā)abview串口被動接收數(shù)據(jù)仿真設(shè)置。
    發(fā)表于 01-15 15:49 ?6.6w次閱讀
    labview<b class='flag-5'>串口</b><b class='flag-5'>接收</b><b class='flag-5'>數(shù)據(jù)</b>_labview<b class='flag-5'>串口</b>被動<b class='flag-5'>接收</b><b class='flag-5'>數(shù)據(jù)</b>

    STM32之串口DMA接收不定長數(shù)據(jù)

    使用stm32或者其他單片機的時候,會經(jīng)常使用到串口通訊,那么如何有效地接收數(shù)據(jù)呢?假如這段數(shù)據(jù)
    發(fā)表于 12-24 19:03 ?30次下載
    STM32之<b class='flag-5'>串口</b>DMA<b class='flag-5'>接收</b>不定長<b class='flag-5'>數(shù)據(jù)</b>

    stm32 發(fā)送完數(shù)據(jù)串口繼續(xù)發(fā)送_STM32之串口DMA接收不定長數(shù)據(jù)

    引言在使用stm32或者其他單片機的時候,會經(jīng)常使用到串口通訊,那么如何有效地接收數(shù)據(jù)呢?假如這段數(shù)據(jù)
    發(fā)表于 12-24 19:17 ?8次下載
    stm32 發(fā)送完<b class='flag-5'>數(shù)據(jù)</b>后 <b class='flag-5'>串口</b>繼續(xù)發(fā)送_STM32之<b class='flag-5'>串口</b>DMA<b class='flag-5'>接收</b>不定長<b class='flag-5'>數(shù)據(jù)</b>

    串口接收中斷--并不是說不使能串口接受中斷就無法接收數(shù)據(jù)

    并不是說不使能串口接受中斷就無法接收數(shù)據(jù),只是為了在串口接收數(shù)據(jù)的時候防止其程序打擾
    發(fā)表于 12-28 19:15 ?15次下載
    <b class='flag-5'>串口</b><b class='flag-5'>接收</b>中斷--并不是說不使能<b class='flag-5'>串口</b>接受中斷就無法<b class='flag-5'>接收</b><b class='flag-5'>數(shù)據(jù)</b>

    串口通訊的基本概念、數(shù)據(jù)格式

    本文介紹了串口通訊的基本概念、數(shù)據(jù)格式、通訊方式、典型的串口通訊標(biāo)準(zhǔn)等內(nèi)容。
    的頭像 發(fā)表于 04-23 11:13 ?5269次閱讀
    <b class='flag-5'>串口</b><b class='flag-5'>通訊</b>的基本概念、<b class='flag-5'>數(shù)據(jù)</b>格式

    如何實現(xiàn)串口數(shù)據(jù)接收呢?

    UART接收數(shù)據(jù)部分是接收另一個串口設(shè)備發(fā)送的數(shù)據(jù),緩存到接收FIFO中。FIFO快要寫滿時,產(chǎn)
    的頭像 發(fā)表于 06-05 15:24 ?3622次閱讀
    如何實現(xiàn)<b class='flag-5'>串口</b><b class='flag-5'>數(shù)據(jù)</b>的<b class='flag-5'>接收</b>呢?

    什么是串口通訊?串口通訊通訊協(xié)議技術(shù)詳解

    一、什么是串口通訊?串行通訊是指僅用一根接收線和一根發(fā)送線就能將數(shù)據(jù)以位進行傳輸?shù)囊环N通訊方式。
    的頭像 發(fā)表于 07-31 17:07 ?5979次閱讀
    什么是<b class='flag-5'>串口</b><b class='flag-5'>通訊</b>?<b class='flag-5'>串口</b><b class='flag-5'>通訊</b>的<b class='flag-5'>通訊</b>協(xié)議技術(shù)詳解

    串口通訊時的數(shù)據(jù)幀格式和通訊協(xié)議有什么區(qū)別?

    串口通訊時的數(shù)據(jù)幀格式和通訊協(xié)議是兩個不同的概念,它們在串口通訊中起著不同的作用,但都是為了實現(xiàn)
    的頭像 發(fā)表于 01-30 09:21 ?1798次閱讀