熱門(mén): 51單片機(jī) | 24小時(shí)必答區(qū) | 單片機(jī)教程 | 單片機(jī)DIY制作 | STM32 | Cortex M3 | 模數(shù)電子 | 電子DIY制作 | 音響/功放 | 拆機(jī)樂(lè)園 | Arduino | 嵌入式OS | 程序設(shè)計(jì)
![]() |
發(fā)布時(shí)間: 2017-4-7 12:11
正文摘要:我在串口助手中輸入0123456789(后面加一個(gè)回車(chē)轉(zhuǎn)行)然后發(fā)送數(shù)據(jù),有的時(shí)候接收數(shù)據(jù)不是正確的,有的時(shí)候接收數(shù)據(jù)正確。 代碼如下: #include <reg52.h>   ... |
當(dāng)你收到一個(gè)字節(jié)后,做了一件事“禁止串口中斷ES=0”,偏偏這個(gè)時(shí)刻,下一個(gè)數(shù)據(jù)又發(fā)來(lái)了,怎么辦? 而且關(guān)的時(shí)間還不短(有一個(gè)字節(jié)的發(fā)送時(shí)間,發(fā)完后才開(kāi)),在這個(gè)時(shí)間里,另一個(gè)數(shù)據(jù)會(huì)沖掉前一個(gè)數(shù)據(jù)!這就丟一個(gè)了。 而且PC發(fā)來(lái)的數(shù)據(jù)流,不能保證時(shí)間間隔是均勻的(指發(fā)了一個(gè)字節(jié)再發(fā)一個(gè)字節(jié)之間的間隔時(shí)間,這個(gè)時(shí)間取決于PC的工作任務(wù)的多寡,pc機(jī)是多用戶(hù)系統(tǒng),不是只做發(fā)送串口數(shù)據(jù)一件事,你無(wú)法撐控)。 運(yùn)氣好,PC數(shù)據(jù)流與你合拍,OK! 運(yùn)氣差,丟幾個(gè)數(shù)據(jù)。 最差,我也說(shuō)不清了。 |
參與人數(shù) 1 | 黑幣 +50 | 收起 理由 |
---|---|---|
![]() | + 50 | 回帖助人的獎(jiǎng)勵(lì)! |
第一,有可能是你的ttl線(xiàn)接觸不好,第二,有可能是你波特率設(shè)置太高,通訊造成數(shù)據(jù)丟失,第三,晶振使用的不合理,造成計(jì)算出來(lái)的波特率誤差較大。 |
ser中斷函數(shù),加一個(gè)判斷RI的語(yǔ)句? |
void uart() interrupt 4 { unsigned char date; date = SBUF;//取出接收到的數(shù)據(jù) RI = 0;//清除接收中斷標(biāo)志位 SBUF = date;//將接收到的數(shù)據(jù)放回發(fā)送緩存器 while(!TI);//等待發(fā)送數(shù)據(jù)完成 TI = 0;//清除發(fā)送中斷標(biāo)志位 } |
建議先接收數(shù)據(jù),再清中斷位,試試 |
建議先接收數(shù)據(jù),再清中斷位,試試 |
本帖最后由 kaixinjiuhao 于 2017-4-8 21:02 編輯 你像風(fēng)兒來(lái)了 發(fā)表于 2017-4-8 10:18 那如果用數(shù)組的形式來(lái)裝載輸入的字符,那應(yīng)該怎么編寫(xiě)呢? 比如: #include <reg52.h> #define uchar unsigned char #define uint unsigned int unsigned char flag,a[4],i,j; void init() { TMOD=0x20; TH1=0xfd; TL1=0xfd; TR1=1; REN=1; SM0=0; SM1=1; EA=1; ES=1; } void main() { init(); while(1) { if(flag==1) { flag=0; ES=0; SBUF=a[j++]; while(!TI); TI=0; ES=1; //flag=0 } } } void ser() interrupt 4 { RI=0; a[i++]=SBUF; if(i==4) flag=1; } 我將interrupt 4中的a變?yōu)閿?shù)組a,我只輸入四個(gè)字符,我在interrupt 4中將SBUF中的四個(gè)字符全部放到數(shù)組中,然后在主函數(shù)中顯示數(shù)組中數(shù)值。 這種方法應(yīng)該怎樣實(shí)現(xiàn)呢? |
參與人數(shù) 1 | 黑幣 +20 | 收起 理由 |
---|---|---|
![]() | + 20 | 回帖助人的獎(jiǎng)勵(lì)! |
#include <reg52.h> #define uchar unsigned char #define uint unsigned int unsigned char flag,a,i; void init() { TMOD=0x20; TH1=0xfd; TL1=0xfd; TR1=1; REN=1; SM0=0; SM1=1; EA=1; ES=1; } void main() { init(); while(1) { if(flag==1) { flag=0; ES=0; SBUF=a; while(!TI); TI=0; ES=1; //flag=0 } } } void ser() interrupt 4 { RI=0; a=SBUF; flag=1; } 我把你程序改成這樣就可以了; 原因是:原來(lái)的程序flag=0,寫(xiě)在了最后一句,要把它寫(xiě)在ES=1前面,否則開(kāi)串口中斷的一瞬間程序被中斷了,也就是下一個(gè)數(shù)據(jù)收到了,但是程序不會(huì)從if()條件那里開(kāi)始執(zhí)行,而是從斷點(diǎn)開(kāi)始執(zhí)行,所以就有數(shù)據(jù)丟失了 |
參與人數(shù) 1 | 黑幣 +3 | 收起 理由 |
---|---|---|
![]() | + 3 | 很給力! |
12MHZ晶振時(shí),bps4800收發(fā)正常,bps9600收發(fā)極容易出錯(cuò)。你用的應(yīng)該是12MHZ吧? |
參與人數(shù) 1 | 黑幣 +20 | 收起 理由 |
---|---|---|
![]() | + 20 | 回帖助人的獎(jiǎng)勵(lì)! |
晶振是多少的? |
加入CRC校驗(yàn),誤碼率會(huì)低,另外TTL電平轉(zhuǎn)為RS232沒(méi)有? |
參與人數(shù) 1 | 黑幣 +20 | 收起 理由 |
---|---|---|
![]() | + 20 | 回帖助人的獎(jiǎng)勵(lì)! |
可能是晶振頻率和波特率方面的原因,要注意計(jì)算出來(lái)的波特率和理論值差值不要太大,超過(guò)3%可能就會(huì)有問(wèn)題,推薦用11.0592和9600 |
參與人數(shù) 1 | 黑幣 +20 | 收起 理由 |
---|---|---|
![]() | + 20 | 回帖助人的獎(jiǎng)勵(lì)! |
imxuheng 發(fā)表于 2017-4-7 14:02 加了延時(shí)也不行 |
收發(fā)太快,接收完之后加個(gè)延時(shí),a=SBUF;delay();flag=1; 也可加個(gè)判斷,要是收發(fā)的數(shù)據(jù)不同,那請(qǐng)求重發(fā) |
參與人數(shù) 1 | 黑幣 +20 | 收起 理由 |
---|---|---|
![]() | + 20 | 回帖助人的獎(jiǎng)勵(lì)! |
Powered by 單片機(jī)教程網(wǎng)