新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > STM32串口中斷接收一個完整的數據幀

        STM32串口中斷接收一個完整的數據幀

        作者: 時間:2016-11-19 來源:網絡 收藏
        代碼運行條件:

        (1)大端發送;
        (2)上位機發送一幀數據的時間間隔不能大于主循環周期;

        本文引用地址:http://www.104case.com/article/201611/318080.htm

        (3)數據幀滿足下面格式:

        幀頭部(Head)

        類型(Type)

        長度(Length)

        值(Value)

        CRC校驗

        2字節

        1字節

        1字節

        X字節

        2字節

        0xaa 0x55

        X

        void USART6_Init (void) {GPIO_InitTypeDef	GPIO_InitStructure;USART_InitTypeDef	USART_InitStructure;NVIC_InitTypeDef	NVIC_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART6,ENABLE);RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC,ENABLE); //修改GPIO_InitStructure.GPIO_Pin	= GPIO_Pin_6|GPIO_Pin_7;//修改GPIO_InitStructure.GPIO_Mode	= GPIO_Mode_AF;GPIO_InitStructure.GPIO_OType	= GPIO_OType_PP;GPIO_InitStructure.GPIO_PuPd	= GPIO_PuPd_NOPULL;GPIO_InitStructure.GPIO_Speed	= GPIO_Speed_50MHz;GPIO_Init(GPIOC,&GPIO_InitStructure);//修改GPIO_PinAFConfig(GPIOC,GPIO_PinSource6,GPIO_AF_USART6);//修改GPIO_PinAFConfig(GPIOC,GPIO_PinSource7,GPIO_AF_USART6);	//修改NVIC_InitStructure.NVIC_IRQChannel = USART6_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);USART_InitStructure.USART_BaudRate = 115200;USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;USART_InitStructure.USART_Mode = USART_Mode_Tx|USART_Mode_Rx;USART_InitStructure.USART_Parity = USART_Parity_No;USART_InitStructure.USART_StopBits = USART_StopBits_1;USART_InitStructure.USART_WordLength = USART_WordLength_8b;USART_Init(USART6,&USART_InitStructure);USART_ITConfig(USART6,USART_IT_RXNE,ENABLE);//打開接收中斷USART_Cmd(USART6,ENABLE);}void USART6_IRQHandler(){unsigned char rCh;static char rCnt = 0;if(USART_GetITStatus(USART6,USART_IT_RXNE) != RESET){rCh = USART_ReceiveData(USART6);COM6_RecvBuf[rCnt] = rCh;if(rCnt == 0)     //幀頭0xAA    {rCnt = (0xAA != rCh)?0:rCnt+1;}else if(rCnt == 1) //幀頭0x55  {rCnt = (0x55 != rCh)?0:rCnt+1;}else if(rCnt == 2) //類型type{//這里可以根據類型的范圍進行如上的處理rCnt++;}else if(rCnt == 3) //長度len{rCnt++;}			else if(rCnt > 3) //值value{rCnt++;if(rCnt == 6+COM6_RecvBuf[3]){             rCnt = 0;memcpy(COM6_RecvBufBck,COM6_RecvBuf,RECV_BUF_SZ);//緩沖COM6_RecvFin = 1;  //通知主循環處理}}}}int  main(void){int i;//代碼段1while(1)//該循環不能太慢,否則數據緩沖區會被部分修改{//代碼段2if(COM6_RecvFin == 1){COM6_RecvFin = 0;CMD_Analysis();//分析接收到的這幀數據}//代碼段3}return  0;}//在以后再仔細分析數據接收較快而處理較慢的問題吧,本課題主要討論的是如何完整的接收一個數據幀,在數據源正確的情況下不丟幀




        評論


        技術專區

        關閉
        主站蜘蛛池模板: 乃东县| 临清市| 衡阳县| 读书| 徐闻县| 轮台县| 定州市| 浪卡子县| 泸水县| 郯城县| 石林| 罗江县| 临沭县| 保定市| 四平市| 东阳市| 陈巴尔虎旗| 永寿县| 托里县| 宜章县| 西平县| 寿阳县| 房产| 科技| 汶上县| 寻甸| 蕲春县| 阳西县| 湖州市| 略阳县| 宁德市| 开江县| 黑龙江省| 历史| 葫芦岛市| 萨嘎县| 外汇| 忻州市| 秦皇岛市| 襄汾县| 德清县|