国产精品久久久aaaa,日日干夜夜操天天插,亚洲乱熟女香蕉一区二区三区少妇,99精品国产高清一区二区三区,国产成人精品一区二区色戒,久久久国产精品成人免费,亚洲精品毛片久久久久,99久久婷婷国产综合精品电影,国产一区二区三区任你鲁

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

三種串口接受不定長數據方法詳解

電子工程師 ? 作者:工程師a ? 2018-06-03 04:15 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

方法1:串口接受數據,定時器來判斷超時是否接受數據完成。

方法2:DMA接受+IDLE中斷

實現思路:采用STM32F103的串口1,并配置成空閑中斷IDLE模式且使能DMA接收,并同時設置接收緩沖區和初始化DMA。那么初始化完成之后,當外部給單片機發送數據的時候,假設這幀數據長度是200個字節,那么在單片機接收到一個字節的時候并不會產生串口中斷,而是DMA在后臺把數據默默地搬運到你指定的緩沖區里面。當整幀數據發送完畢之后串口才會產生一次中斷,此時可以利用DMA_GetCurrDataCounter();函數計算出本次的數據接受長度,從而進行數據處理。

應用對象:適用于各種串口相關的通信協議,如:MODBUS,PPI ;還有類似于GPS數據接收解析,串口WIFI的數據接收等,都是很好的應用對象。

關鍵代碼分析:

void uart_init(u32 bound);

void MYDMA_Enable(DMA_Channel_TypeDef*DMA_CHx);

#endif

usart.C

//初始化IO 串口1

//bound:波特率

void uart_init(u32 bound)

{

//GPIO端口設置

GPIO_InitTypeDef GPIO_InitStructure;

USART_InitTypeDef USART_InitStructure;

NVIC_InitTypeDef NVIC_InitStructure;

DMA_InitTypeDef DMA_InitStructure;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA,ENABLE); //使能USART1,GPIOA時鐘

RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); //使能DMA傳輸

RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);//使能USART2時鐘

USART_DeInit(USART1); //復位串口1

//USART1_TX PA.9

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //PA.9

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //復用推挽輸出

GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化PA9

//USART1_RX PA.10

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空輸入

GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化PA10

//Usart1 NVIC 配置

NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;//搶占優先級3

NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //子優先級3

NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能

NVIC_Init(&NVIC_InitStructure); //根據指定的參數初始化VIC寄存器

//USART 初始化設置

USART_InitStructure.USART_BaudRate = bound;

USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字長為8位數據格式

USART_InitStructure.USART_StopBits = USART_StopBits_1;//一個停止位

USART_InitStructure.USART_Parity = USART_Parity_No;//無奇偶校驗位

USART_InitStructure.USART_HardwareFlowControl =USART_HardwareFlowControl_None;//無硬件數據流控制

USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //收發模式

USART_Init(USART1, &USART_InitStructure); //初始化串口

USART_ITConfig(USART1, USART_IT_IDLE, ENABLE);//開啟空閑中斷

USART_DMACmd(USART1,USART_DMAReq_Rx,ENABLE); //使能串口1 DMA接收

USART_Cmd(USART1, ENABLE); //使能串口

//相應的DMA配置

DMA_DeInit(DMA1_Channel5); //將DMA的通道5寄存器重設為缺省值 串口1對應的是DMA通道5

DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)&USART1->DR; //DMA外設usart基地址

DMA_InitStructure.DMA_MemoryBaseAddr = (u32)DMA_Rece_Buf; //DMA內存基地址

DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; //數據傳輸方向,從外設讀取發送到內存

DMA_InitStructure.DMA_BufferSize = DMA_Rec_Len; //DMA通道的DMA緩存的大小

DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; //外設地址寄存器不變

DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; //內存地址寄存器遞增

DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte; //數據寬度為8位

DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte; //數據寬度為8位

DMA_InitStructure.DMA_Mode = DMA_Mode_Normal; //工作在正常緩存模式

DMA_InitStructure.DMA_Priority = DMA_Priority_Medium; //DMA通道 x擁有中優先級

DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; //DMA通道x沒有設置為內存到內存傳輸

DMA_Init(DMA1_Channel5, &DMA_InitStructure); //根據DMA_InitStruct中指定的參數初始化DMA的通道

DMA_Cmd(DMA1_Channel5, ENABLE); //正式驅動DMA傳輸

}

//重新恢復DMA指針

void MYDMA_Enable(DMA_Channel_TypeDef*DMA_CHx)

{

DMA_Cmd(DMA_CHx, DISABLE ); //關閉USART1 TX DMA1所指示的通道

DMA_SetCurrDataCounter(DMA_CHx,DMA_Rec_Len);//DMA通道的DMA緩存的大小

DMA_Cmd(DMA_CHx, ENABLE); //打開USART1 TX DMA1所指示的通道

}

//發送len個字節

//buf:發送區首地址

//len:發送的字節數

void Usart1_Send(u8 *buf,u8 len)

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 串口
    +關注

    關注

    15

    文章

    1618

    瀏覽量

    82809
  • STM32F103
    +關注

    關注

    34

    文章

    495

    瀏覽量

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

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    FreeRTOS串口DMA收發不定長數據

    FreeRTOS例程,介紹串口DMA收發不定長數據
    的頭像 發表于 09-26 09:08 ?6325次閱讀
    FreeRTOS<b class='flag-5'>串口</b>DMA收發<b class='flag-5'>不定長</b><b class='flag-5'>數據</b>

    FreeRTOS串口中斷接收不定長數據與二值信號量的使用

    FreeRTOS例程,使用串口中斷接收不定長數據,以及二值信號量的使用
    的頭像 發表于 09-26 09:02 ?6203次閱讀
    FreeRTOS<b class='flag-5'>串口</b>中斷接收<b class='flag-5'>不定長</b>的<b class='flag-5'>數據</b>與二值信號量的使用

    不定長數據接收的原理是什么?怎么實現串口數據不定長接收?

    不定長數據接收的原理是什么?怎么實現串口數據不定長接收?
    發表于 11-16 08:11

    有什么方法可以實現stm32串口接受不定長數據

    有什么方法可以實現stm32串口接受不定長數據呢?有哪幾種方法
    發表于 12-08 06:59

    STM32串口接收不定長數據的實現方法

    STM32串口接收不定長數據的實現方法
    發表于 12-09 06:17

    如何用stm32串口接受Arduino發送的一個不定長數據

    如何用stm32串口接受Arduino發送的一個不定長數據呢?如何對其進行解析呢?
    發表于 12-13 06:00

    HAL庫下串口接收不定長數據方法

    STM32單片機HAL庫下串口接收不定長數據HAL庫下的串口接收不定長數據CubeMX配置過程代
    發表于 01-19 06:55

    STM32+串口空閑中斷實現不定長數據接收

    常見的數據幀斷幀方式有兩,一是通過固定的協議格式斷幀,另外一個是通過兩幀數據的時間斷幀,下面介紹最后一,利用STM32F1的
    發表于 12-20 19:34 ?7次下載
    STM32+<b class='flag-5'>串口</b>空閑中斷實現<b class='flag-5'>不定長</b><b class='flag-5'>數據</b>接收

    stm32 串口接收不定長度數據及黏包處理 + 串口DMA接收

    1.不定長度數據 為什么會存在串口接收不定長度數據呢?首先,在通信雙方進行數據傳輸的時候,由于不同的設備在實現控制,數據采樣時,發送的
    發表于 12-23 19:09 ?27次下載
    stm32 <b class='flag-5'>串口</b>接收<b class='flag-5'>不定長度數據</b>及黏包處理 + <b class='flag-5'>串口</b>DMA接收

    STM32CUBE MX串口DMA+中斷不定長接收詳解

    串口DMA+中斷不定長接收詳解stm32cube mx作為ST官方生成固件極大的幫助了我們,不再為移植底層寄存器而浪費太多時間,但是在提高效率的同時,HAL庫中還有一些莫名其妙的坑,需要我們自行解決
    發表于 12-24 18:48 ?6次下載
    STM32CUBE MX<b class='flag-5'>串口</b>DMA+中斷<b class='flag-5'>不定長</b>接收<b class='flag-5'>詳解</b>

    STM32 DMA串口接收不定長數據

    STM32 DMA串口接收不定長數據
    發表于 12-24 18:50 ?41次下載
    STM32  DMA<b class='flag-5'>串口</b>接收<b class='flag-5'>不定長</b><b class='flag-5'>數據</b>

    STM32之串口DMA接收不定長數據

    目錄STM32之串口DMA接收不定長數據引言DMA簡介什么是DMA在STM32的DMA資源DMA接收數據判斷數據接收完成接收完
    發表于 12-24 19:03 ?30次下載
    STM32之<b class='flag-5'>串口</b>DMA接收<b class='flag-5'>不定長</b><b class='flag-5'>數據</b>

    STM32CubeMX之串口接收不定長數據

    基本串口通信通常只能接收到定長數據,無法穩定接收不定長數據,本章介紹利用STM32單片機的IDLE空閑中斷,接收
    的頭像 發表于 05-11 09:59 ?4972次閱讀
    STM32CubeMX之<b class='flag-5'>串口</b>接收<b class='flag-5'>不定長</b><b class='flag-5'>數據</b>

    三種方法實現串口接收不定長度的數據

    下面三種方式都親測可用,實際使用時應采用第三種方法,更有效率。
    的頭像 發表于 09-14 16:16 ?1.6w次閱讀
    <b class='flag-5'>三種方法</b>實現<b class='flag-5'>串口</b>接收<b class='flag-5'>不定長</b>度的<b class='flag-5'>數據</b>

    【代碼分享】基于樂鑫ESP32的串口不定長數據接收方法

    【代碼分享】基于樂鑫ESP32的串口不定長數據接收方法
    的頭像 發表于 11-15 01:02 ?2194次閱讀
    【代碼分享】基于樂鑫ESP32的<b class='flag-5'>串口</b><b class='flag-5'>不定長</b><b class='flag-5'>數據</b>接收<b class='flag-5'>方法</b>