![]() |
發(fā)布時間: 2019-6-7 20:33
正文摘要:問題說明:我設置的波特率是9600,然后這個程序就是筆記本發(fā)送數(shù)據(jù)給單片機,單片機馬上原封不動地發(fā)送回去,但是在發(fā)送回來的時候發(fā)現(xiàn)缺位了,比如說我發(fā)送了一串數(shù)字2019060720055905,但是傳回來的時候有時候就少 ... |
哪里抄的代碼,代碼中很多錯誤 串口通信注意的是: 1. 晶振的誤差會導致數(shù)據(jù)發(fā)生錯誤 2. 發(fā)送速度的快慢, 一個巴掌扇過去,那個人還沒來得及回復你,你又一個巴掌,他做啞巴得了,你白問了. 3. 沒有對數(shù)據(jù)進行校驗的函數(shù) 4. 接收或發(fā)送數(shù)據(jù)時, 沒有進行ES或EA處理,不就存在BUG了么 |
這么改 1. 漏了個分號 void SendByte(uchar dat) { SBUF = dat; while(!TI); // 這里加上分號 TI=0; } 2. 中斷服務程序的收發(fā)看似沒問題,當單片機的波特率比電腦略低時,有一定的概率上一個字節(jié)發(fā)送還沒完下一個字節(jié)就收到了,簡單粗暴的改法是 把 SBUF=temp; 改為 SendByte(temp); |
yumer 發(fā)表于 2019-6-10 11:39 嗯嗯,確實是這樣,多謝指教了! |
串口通訊的時間是最主要的,要保證兩個通訊的頻率是一樣的,其次對于發(fā)射和接受的延時等待時間也要一致 |
闊愛的釗釗 發(fā)表于 2019-6-10 01:01 自己也是剛學,很多東西都不太懂,只好在源碼上做簡單修改 |
波特率和檢驗的問題,小老弟串口不要用人家的源碼呀,bug多得嚇死人喲,還占資源 |
我覺得可以加個校驗 |
he_37 發(fā)表于 2019-6-8 22:57 更有意思的是我整個串口中斷程序沒有把TI置0也可以進行串口通訊,只是也有丟位。 void UART_SER() interrupt 4 { uchar temp; if(RI) { RI = 0; temp = SBUF; SBUF = temp; /*下面兩個語句就是SendByte(uchar dat)的功能*/ while(!TI); } } |
he_37 發(fā)表于 2019-6-8 22:57 分號是我復制粘貼上來的時候不小心刪掉了,不過我想了下你的改法應該是對的,后面我嘗試了下也確實是對的,沒有出現(xiàn)過一次丟包,不過我又有了一個新問題,我先把代碼復制上來吧。void UART_SER() interrupt 4{ uchar temp; if(RI) { RI = 0; temp = SBUF; SBUF = temp; /*下面兩個語句就是SendByte(uchar dat)的功能*/ while(!TI); TI = 0; } } 我是這么想的,電腦發(fā)送了一個8位數(shù)據(jù)過來,單片機接收端的SBUF接收了,然后我把數(shù)據(jù)轉(zhuǎn)給了發(fā)送端的SBUF,然后就是while(!TI);等待單片機發(fā)送完,但是我的串口中斷還是開的,那么當單片機數(shù)據(jù)發(fā)送完TI置1,那么就會觸發(fā)中斷,然后又從中斷函數(shù)開頭uchar temp;開始,那么而且我也把TI=0;語句刪了,那么按道理就是應該無限循環(huán)啊,為啥還會完整把整個數(shù)據(jù)接收完呢?我現(xiàn)在也搞不懂了。 |
數(shù)據(jù)傳輸開始和完成都需要有確認語句,方可進行下一步的操作 |
lele5211314 發(fā)表于 2019-6-8 17:30 我數(shù)碼管確實用的是定時器0,串口用的是定時器1啊 |
xuyaqi 發(fā)表于 2019-6-8 08:35 那需要在哪里加延時函數(shù)呢? |
lwh999995 發(fā)表于 2019-6-8 12:37 這個代碼是我參照例子寫的。首先我用的是11.0592MHz的晶振,波特率9600,我想問下需要延時要在哪里加_nop_()函數(shù)呢?另外我這個因為是電腦和單片機通訊,為了簡單一點所以沒有校驗,最后接受和發(fā)送數(shù)據(jù)的時候要關(guān)閉總中斷來避免多個中斷干擾數(shù)據(jù)傳輸嗎? |
數(shù)碼管用定時器0,串口的用定時器1 |
可能是兩個單片機的波特率誤差導致的,你可以換幾組波特率試試,如果還是不行,最好加CRC 校驗等校驗模式進行校驗,也可以考慮采用糾錯碼來糾正誤碼! |
發(fā)送雙方都要給對方留出處理信息的時間。 |
發(fā)送雙方都要給對方留出處理信息的時間。 |
懇請各位大佬指點![]() |
Powered by 單片機教程網(wǎng)