新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > STM32-串口超時判斷方式接收未知長度數據

        STM32-串口超時判斷方式接收未知長度數據

        作者: 時間:2016-11-23 來源:網絡 收藏
        usart.c串口中斷處理函數:

        本文引用地址:http://www.104case.com/article/201611/320443.htm
        [cpp]view plaincopy
        1. voidUSART1_IRQHandler(void)
        2. {
        3. u8res;
        4. if(USART1->SR&(1<<5))//接收到數據
        5. {
        6. res=USART1->DR;
        7. if(USART1_Recv_Len
        8. {
        9. TIM3->CNT=0;//計數器清空
        10. if(Rec_Over_Flag==0)TIM3_Set(1);//使能定時器4的中斷
        11. USART1_RX_BUF[USART1_Recv_Len++]=res;//記錄接收到的值
        12. }else
        13. {
        14. Rec_Over_Flag=1;//強制標記接收完成
        15. }
        16. }
        17. }
        18. timer.c定時器中斷函數
        19. //定時器3中斷服務程序
        20. voidTIM3_IRQHandler(void)
        21. {
        22. if(TIM3->SR&0X0001)//溢出中斷
        23. {
        24. Rec_Over_Flag=1;
        25. TIM3->SR&=~(1<<0);//清除中斷標志位
        26. TIM3_Set(0);
        27. LED1=!LED1;//RxTimeout等于0,變換LED1表明該次發送結束
        28. }
        29. }
        30. //設置TIM4的開關
        31. //sta:0,關閉;1,開啟;
        32. voidTIM3_Set(u8sta)
        33. {
        34. if(sta)
        35. {
        36. TIM3->CNT=0;//計數器清空
        37. TIM3->CR1|=1<<0;//使能定時器3
        38. }elseTIM3->CR1&=~(1<<0);//關閉定時器3
        39. }

        main.c主函數

        [cpp]view plaincopy
        1. intmain(void)
        2. {
        3. u8t;
        4. u8Password[7]="123456";
        5. u8Tishi1[]="操作碼長度不對";
        6. u8Tishi2[]="操作碼不正確";
        7. u8Tishi3[]="指令成功執行!";
        8. u16times=0;
        9. Stm32_Clock_Init(9);//系統時鐘設置
        10. delay_init(72);//延時初始化
        11. uart_init(72,57600);//串口初始化為57600
        12. LED_Init();//初始化與LED連接的硬件接口
        13. Timerx_Init(99,7199);//10kHz的技術頻率,計數到100為10ms
        14. while(1)
        15. {
        16. if(Rec_Over_Flag==1)
        17. {
        18. if(USART1_Recv_Len!=0x06)//USART1_Recv_Len接收數據的長度不等于6
        19. {
        20. Putstrings(Tishi1);
        21. }
        22. else//USART1_Recv_Len接收數據的長度等于6
        23. {
        24. for(t=0;t
        25. {
        26. if(USART1_RX_BUF[t]!=Password[t])
        27. {
        28. Putstrings(Tishi2);
        29. break;
        30. }
        31. elseif(t==(USART1_Recv_Len-1))
        32. {
        33. Putstrings(Tishi3);
        34. LED0=!LED0;
        35. }
        36. }
        37. }
        38. Rec_Over_Flag=0;
        39. USART1_Recv_Len=0;
        40. }
        41. else
        42. {
        43. times++;
        44. //if(times%30==0)LED1=!LED1;//閃爍LED,提示系統正在運行.
        45. //if(times%30==0)RxTimeout--;
        46. delay_ms(10);
        47. }
        48. }
        49. }
        50. //------------輸出字符串到串口-------------------
        51. voidPutstrings(u8*ptr)
        52. {
        53. while(*ptr!= 主站蜘蛛池模板: 金川县| 永康市| 娄烦县| 扶沟县| 甘南县| 河源市| 凤城市| 崇阳县| 山东| 丽水市| 云梦县| 新津县| 定兴县| 邢台市| 东丽区| 乐都县| 呼图壁县| 弥勒县| 三亚市| 华宁县| 临沂市| 吉林市| 云林县| 揭东县| 丹阳市| 大理市| 常州市| 马关县| 泉州市| 昭平县| 旌德县| 塔城市| 五大连池市| 海门市| 龙陵县| 且末县| 阳高县| 定兴县| 环江| 长武县| 腾冲县|