![]() |
發(fā)布時間: 2015-8-28 14:16
正文摘要:在寫一個串口接受多字節(jié)的一個程序時遇到了一個問題,我寫程序使52單片機以9600波特率接受串口助手發(fā)送來的12個字節(jié),然后再發(fā)回去,但是在程序啟動時,單片機第一次收到數(shù)據(jù)并發(fā)回,發(fā)現(xiàn)在發(fā)回的數(shù)據(jù)中第一個字節(jié)變 ... |
要有幀頭 幀尾 我寫過兩個單片機藍牙通信的程序。你加上幀頭 幀尾就行了,再有校驗位的話,基本萬無一失。這個代碼雖然不難 但是想了好久 分享一下 |
QQ截圖20181127195125.jpg (38.71 KB, 下載次數(shù): 41)
進入中斷時候,先判斷RI是否等于1,然后在把sbuf的數(shù)據(jù)放入數(shù)組中 |
請問現(xiàn)在解決了嗎?求 |
可能是中斷問題 |
謝謝講解 |
4:在中斷里加while(!ri)這樣的語句,是巴不得系統(tǒng)死掉的寫法。應(yīng)該用if(ri==0) {再查下為啥進中斷居然不置位,然后清掉,return;} 這樣才是王道 |
1:你的代碼沒有任何容錯。你既然用0d開頭,那你就要檢查一下0d,或者插入兩到三個無意義的數(shù)據(jù)作為頭。同時加入長度域和校驗值。 2:出現(xiàn)ff的可能有兩種情況,發(fā)送出錯或接收出錯。 起始位為邏輯0,那么不發(fā)送的時候最好是邏輯1.你開始初始化pc機或者單片機的時候,pc機或單片機在初始化之前他的狀態(tài)不是rs232協(xié)議,單片機很多時候口是復(fù)用的,有可能開始收到或發(fā)送的就會錯。這個很好解釋。 3:你的代碼計數(shù)到12,所以多了個ff,自然少了最后一個,這個很正常,這就是為啥我建議你加校驗和頭,長度的原因。 4:這種代碼風(fēng)格出錯是正常的,不錯才不正常。 |
SER中斷有問題,判斷到RI==0馬上退出;RI==1才接收SBUF,清RI |
ser中斷有問題,里面判斷RI==1就清RI=0,接收SBUF,退出中斷;如果RI==0直接退出 |
同樣問題同求 |
第一次單片機也是接收12個字節(jié), 只不過第一個字節(jié)是FF,樓主可以重點分析這個FF是從哪來的 |
老貼不回了 |
建議接收到數(shù)據(jù)后delay 一下,再發(fā)送數(shù)據(jù)。先調(diào)試發(fā)送一個BYTE成功后再調(diào)試發(fā)送接收多個BYTE。 |
init加flag=0試試 |
我感覺要先設(shè)置串口工作方式后在允許串口發(fā)送數(shù)據(jù) |
發(fā)送的數(shù)據(jù)回傳么,接收到一個字節(jié)進入接收中斷后,直接發(fā)送, |
是不是緩沖區(qū)里有上次發(fā)送的數(shù)據(jù)導(dǎo)致亂碼。。 |
這個問題我也遇到過,有時候也自己就正常了 |
在中斷里面接收到數(shù)據(jù)之后馬上發(fā)送看看 不要設(shè)置flag標(biāo)志位 你看看結(jié)果是不是正確的 |
從調(diào)試方法上來說,先單個字節(jié)發(fā)送,然后在多個字節(jié)發(fā)送 |
51串口常於power on第一次傳送時常會發(fā)生資料錯誤, 所以, 建議power on時, 可以要求51串口, 傳任意資料, 之後, 才開始接收資料.... |
在中斷里面接收到數(shù)據(jù)之后馬上發(fā)送看看 不要設(shè)置flag標(biāo)志位 你看看結(jié)果是不是正確的 |
沒人回復(fù),自頂 |
Powered by 單片機教程網(wǎng)