stm32的初學者
做了一下串口收發的實驗
主函式代碼如下:

開啟了接收中斷
中斷函式如下:

實驗目的:
通過發送一個字符到開發板,然后在發送回來;
中斷里想實作的是 接收完成后,LED燈閃爍一下
下載到開發板里
實作現象是:發送一個字符a,串口除錯助手不停的接收到aaaaaaaaaaaaaaaaaa……
LED燈沒有閃爍。
感覺沒有進入中斷函式
請問一下
是哪里出現了問題
uj5u.com熱心網友回復:
你主程式一直在發送接收的資料啊uj5u.com熱心網友回復:
你的程式寫的不判斷是否接收到資料都在向上位機發送資料啊,而且你接收中斷里寫的,收到資料狀態翻轉一下,也不是閃爍的動作uj5u.com熱心網友回復:
跟著教程學一遍,再自由發揮。步子太大了學東西就會遺漏掉很多重要的東西。led要閃爍,閃爍至少要100ms以上吧,不太可能在中斷里等待100ms,當然不推薦這樣做,比較好的做法是主函式進入while后case flag,在中斷中賦值flag,進入到case下面的while,當flag變化時跳出回圈。在回圈中你就可以延時,閃爍led。調串口先調發送,單片機發送資料到電腦,再調收發,單片機收到什么回什么,再調邏輯。你現在需要知道,你電腦發送給單片機的資料是什么,發送了多少個,底下程式是怎么執行的。執行到某一個步,你可以用串口發回一個01 或者02 ,03,代表運行到哪里了,這樣你根據數字就能輕易知道,單片機代碼是怎么運行的。總之,當你覺得做東西難的時候一定要堅持,總會越來越簡單,越來越成長。uj5u.com熱心網友回復:
中斷函式不要處理太多事情,還延時,這是大忌。uj5u.com熱心網友回復:
第一,中斷里面不要延時,可以在主函式里面去監聽一個標志flag,然后在終端里面去置這個標志位;第二,LED延時的時間最好大于100ms;建議1s中閃爍一次;
第三,一直在接收aaaaaa,能確定你的上位機只發送了一次嗎?還是在回圈發送a?
uj5u.com熱心網友回復:
你的主程式上的一直呼叫串口發送,中斷上盡量簡單、處理東西越少越好,不能帶delay.,uj5u.com熱心網友回復:
謝謝大佬們的解答,受益匪淺uj5u.com熱心網友回復:
中斷函式里面不能處理太多作業,不要把延時函式放里面uj5u.com熱心網友回復:
謝謝大佬們 學到了uj5u.com熱心網友回復:
我只看見了你清除串口中斷標志位,但是并未清除陣列啊,相當于你的串口接受陣列里,一直都保存著‘a’,你在主函式中,只是單純的發送,所以,出現了一串‘a’,是有原因的。uj5u.com熱心網友回復:
原因一、我只看見了你清除串口中斷標志位,但是并未清除陣列啊,相當于你的串口接受陣列里,一直都保存著‘a’,你在主函式中,只是單純的發送,所以,出現了一串‘a’,是有原因的。原因二、我覺得與LED燈沒有狀態翻轉與代碼有直接關系,按照你的邏輯,這一部分是肯定執行了,你可以換成最簡單的LED=0;LED=1;試一下。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/109942.html
標籤:單片機/工控
下一篇:安裝mdk5編譯跑馬燈出錯
