|
|||||||||||
| 技術(shù)交流 | 電路欣賞 | 工控天地 | 數(shù)字廣電 | 通信技術(shù) | 電源技術(shù) | 測(cè)控之家 | EMC技術(shù) | ARM技術(shù) | EDA技術(shù) | PCB技術(shù) | 嵌入式系統(tǒng) 驅(qū)動(dòng)編程 | 集成電路 | 器件替換 | 模擬技術(shù) | 新手園地 | 單 片 機(jī) | DSP技術(shù) | MCU技術(shù) | IC 設(shè)計(jì) | IC 產(chǎn)業(yè) | CAN-bus/DeviceNe |
我的串口中斷函數(shù) 大家請(qǐng)看 |
| 作者:學(xué)點(diǎn)東西吧 欄目:單片機(jī) |
“串口調(diào)試工具那就看到 發(fā)個(gè)沒(méi)完 不知道怎么回師就停不下來(lái)了 “,不明白什么意思。到底一直在發(fā)呢還是一回就停下來(lái)了。 而且,這句if (gbsednum==16) 根本起不到控制發(fā)送的作用。 總之,你說(shuō)得不清楚! |
| 2樓: | >>參與討論 |
| 作者: 水星 于 2005/5/18 15:04:00 發(fā)布:
樓主,你的中斷服務(wù)程序有問(wèn)題啦 “ if ((gbsednum<16)&&(gbsednum>=0)) SBUF = data_send[gbsednum++]; // 將一個(gè)字節(jié)發(fā)送完畢之后TI 置1 if (gbsednum==16) //發(fā)送完畢 { gbsednum = 0; } ” 你的發(fā)送永遠(yuǎn)沒(méi)有結(jié)束的時(shí)刻,當(dāng)發(fā)送到第16個(gè)數(shù)的時(shí)候又開(kāi)始從第一個(gè)重發(fā)了 |
|
| 3樓: | >>參與討論 |
| 作者: 水星 于 2005/5/18 15:12:00 發(fā)布:
修改意見(jiàn) if (gbsednum==16) //發(fā)送完畢 { gbsednum = 0; } 所干的活放到中斷服務(wù)程序外部去做 |
|
| 4樓: | >>參與討論 |
| 作者: hollly 于 2005/5/19 10:28:00 發(fā)布:
我修改后的串口中斷發(fā)送函數(shù) 我修改后的串口中斷發(fā)送函數(shù) if(TI) // 發(fā)送中斷函數(shù) 依次發(fā)送16個(gè)字節(jié) { TI=0; if ((gbsednum<16)&&(gbsednum>=0)) SBUF = data_send[gbsednum++]; // 將一個(gè)字節(jié)發(fā)送完畢之后TI 置1 if (gbsednum==16) //發(fā)送完畢 { gbsendfinshed =1; } } 我的主函數(shù) if (gbreceivefinshed) //假如實(shí)驗(yàn)板有7個(gè)字節(jié)的接收 { gbreceivefinshed = 0; for (j=0;j<16;j++) data_send[j] = data_receive[j]; TI=1; LED3 ^=1; LED4 ^=1; } if (gbsendfinshed) //發(fā)送完畢之后 { gbsendfinshed = 0; gbsednum = 0; LED1 ^=1; LED2 ^=1; TI = 0; } 可是修改后還是這樣啊 還是停不下來(lái)? 怎么回師呢? 真是不懂拉~~~ 現(xiàn)在的效果是 這些LED都能亮 能看的到 LED1 LED2 不停的閃 覺(jué)得很奇怪啊 當(dāng)出現(xiàn)gbsendfinshed =1;時(shí)不是已經(jīng)發(fā)送停止了嗎? 是什么原因有發(fā)送呢?? 真是不解 高手再看看吧。。 |
|
| 5樓: | >>參與討論 |
| 作者: HOLLLY 于 2005/5/19 11:59:00 發(fā)布:
串口中斷服務(wù)流程具體是怎么一繪事呢? 串口中斷服務(wù)流程 當(dāng)主函數(shù)中TI = 1 后 進(jìn)入中斷函數(shù) 當(dāng)?shù)谝淮螆?zhí)行: SBUF = data_send[gbsednum++]; 后 程序的指針PC到哪去了呢? 不是串行發(fā)送需要時(shí)鐘嗎? 是不是跳出中斷函數(shù)返回到主函數(shù) 當(dāng)這個(gè)字符發(fā)送完畢之后又TI 置1 返回中斷函數(shù)呢?~ 還是PC在中斷函數(shù)中等待TI==1呢~ 不解 |
|
| 6樓: | >>參與討論 |
| 作者: dengm 于 2005/5/19 12:16:00 發(fā)布:
RE: if (gbsednum==16) //發(fā)送完畢 { gbsednum = 0; ES = 0 ; } |
|
| 7樓: | >>參與討論 |
| 作者: HOLLLY 于 2005/5/19 12:30:00 發(fā)布:
TO: dengm 關(guān)閉之后還怎么發(fā)? |
|
| 8樓: | >>參與討論 |
| 作者: sujiechen 于 2005/5/19 16:50:00 發(fā)布:
這樣試試看 if(TI) // 發(fā)送中斷函數(shù) 依次發(fā)送16個(gè)字節(jié) { TI=0; if ((gbsednum<16)&&(gbsednum>0)) SBUF = data_send[gbsednum++]; // 將一個(gè)字節(jié)發(fā)送完畢之后TI 置1 if (gbsednum==16) //發(fā)送完畢 { gbsendfinshed =1; gbsednum =0; } } 主函數(shù) if (gbreceivefinshed) //假如實(shí)驗(yàn)板有7個(gè)字節(jié)的接收 { gbreceivefinshed = 0; for (j=0;j<16;j++) data_send[j] = data_receive[j]; // TI=1; ///不要這句了 ////////////////////////////////////////////// SBUF = data_send[0]; //發(fā)完第0字節(jié)后觸發(fā)中斷 gbsednum = 1; //進(jìn)中斷后從第1字節(jié)開(kāi)始發(fā) /////////////////////////////////////////// LED3 ^=1; LED4 ^=1; } |
|
| 9樓: | >>參與討論 |
| 作者: hollly 于 2005/5/20 0:37:00 發(fā)布:
我試了 還是不行 怪了 到底是設(shè)么原因呢?! 一個(gè)串口都搞不定~~!!~~~ |
|
| 10樓: | >>參與討論 |
| 作者: hollly 于 2005/5/20 0:55:00 發(fā)布:
有人知道嗎? 是不是我的編程思路有問(wèn)題呢? 懇求大蝦指點(diǎn)一二 小弟在此感激不盡拉 |
|
| 11樓: | >>參與討論 |
| 作者: sujiechen 于 2005/5/20 9:36:00 發(fā)布:
我很久沒(méi)搞51了,忘得差不多了 |
|
| 12樓: | >>參與討論 |
| 作者: hj_sheng 于 2005/5/20 9:44:00 發(fā)布:
應(yīng)該這樣的就可以了 當(dāng)發(fā)送完最后一個(gè)字節(jié)時(shí),gbsednum以清0,當(dāng)發(fā)送完最后一位時(shí),還要響應(yīng)中斷,因gbsednum已清0,這樣就不停的發(fā)送數(shù)據(jù).設(shè)一標(biāo)志位,當(dāng)發(fā)送完成時(shí)置1,停止發(fā)送數(shù)據(jù),再把發(fā)送位置0. bit t=0; //發(fā)送完成標(biāo)志 if(TI) // 發(fā)送中斷函數(shù) 依次發(fā)送16個(gè)字節(jié) { if(!t) { TI=0; if ((gbsednum<16)&&(gbsednum>=0)) SBUF = data_send[gbsednum++]; if (gbsednum==16) //發(fā)送完畢 { gbsednum = 0; t=1;//發(fā)送完成 } } else { TI=0;//清發(fā)送完成標(biāo)志 t=0;//發(fā)送完成置0,保證下一次發(fā)送 } } |
|
| 13樓: | >>參與討論 |
| 作者: hollly 于 2005/5/20 11:03:00 發(fā)布:
我修改后出現(xiàn)的情況 接收到的是這個(gè) f纊ff榝鄦?x鏋x瀈 占23個(gè)字節(jié) 可是不應(yīng)該啊 我的發(fā)送緩沖是16個(gè)字節(jié)啊 真奇怪 |
|
| 14樓: | >>參與討論 |
| 作者: sujiechen 于 2005/5/20 14:08:00 發(fā)布:
你這是亂碼,是波特率不對(duì)啊,再算一下吧 |
|
| 15樓: | >>參與討論 |
| 作者: 艾森豪威爾 于 2005/5/20 15:52:00 發(fā)布:
? 長(zhǎng)度開(kāi)始置為16.中斷里面判斷長(zhǎng)度如果大于0,發(fā)送.每發(fā)送一個(gè),長(zhǎng)度減1,減到零自然不發(fā)了. |
|
| 16樓: | >>參與討論 |
| 作者: hollly 于 2005/5/20 15:54:00 發(fā)布:
回復(fù) sujiechen 大哥 你真了不起 我在串口調(diào)試工具中改為4800 就可以出來(lái)了 完全正確的!! 可是為什么我以前就可以呢?也是這樣啊 就可以的 沒(méi)什么問(wèn)題的啊~~ 奇怪 看來(lái)還得認(rèn)真看看 謝謝各位! |
|
| 17樓: | >>參與討論 |
| 作者: hotpower 于 2005/5/21 1:12:00 發(fā)布:
(gbsednum>=0)是廢話 bit gbreceivefinshed = 0; unsigned CHAR gbresnum =0; unsigned CHAR gbsednum =0; void serial()interrupt 4 using 1 { //.................... if(TI) // 發(fā)送中斷函數(shù) 依次發(fā)送16個(gè)字節(jié) { TI=0; if ((gbsednum<16)&&(gbsednum>=0)) SBUF = data_send[gbsednum++]; // 將一個(gè)字節(jié)發(fā)送完畢之后TI 置1 if (gbsednum==16) //發(fā)送完畢 { gbsednum = 0; } } //.................... } 疑問(wèn): gbsednum 為unsigned CHAR,那么 if ((gbsednum<16)&&(gbsednum>=0)) 實(shí)際為 if (gbsednum<16) 因?yàn)間bsednum>=0永為真... 其他沒(méi)細(xì)看...不好發(fā)表意見(jiàn). |
|
| 18樓: | >>參與討論 |
| 作者: hollly 于 2005/5/21 13:02:00 發(fā)布:
回復(fù) 大家! 首先謝謝各位的指點(diǎn)! 關(guān)于這個(gè) (gbsednum>=0) 是網(wǎng)友說(shuō)的 我加上是為了保險(xiǎn),其實(shí)我也覺(jué)得沒(méi)有必要! 自從hj_sheng 指教后正確了 現(xiàn)在我的串口調(diào)通了 可以連續(xù)發(fā)送16個(gè)字節(jié)了 其原因是我的另一個(gè)定時(shí)器的PCON設(shè)為0X00了 和我這個(gè)沖突了 郁悶(這個(gè)是0X80) 現(xiàn)在從計(jì)算機(jī)向單片機(jī) 發(fā)送 7個(gè)字節(jié) 就可以完全返回16個(gè)字節(jié)了(我程序是這樣的 ) 現(xiàn)在又發(fā)現(xiàn)另一個(gè) 問(wèn)題 第一次完全正確 可是從第二次又出現(xiàn)亂碼了 難道又是波特率的問(wèn)題了?? |
|
| 19樓: | >>參與討論 |
| 作者: hotpower 于 2005/5/21 13:05:00 發(fā)布:
設(shè)停止位為2位即可 |
|
| 20樓: | >>參與討論 |
| 作者: 水星 于 2005/5/21 13:25:00 發(fā)布:
樓主啊…… 你重復(fù)往串口灌數(shù)據(jù),而且沒(méi)有關(guān)閉串口中斷,正常的情況下它當(dāng)然不斷中斷發(fā)送了,又怎么會(huì)停下來(lái)呢? 串口中斷模式下發(fā)送的兩個(gè)條件: 1,有數(shù)據(jù)往SBUF灌; 2,你的初始化完好,中斷開(kāi)啟并且觸發(fā)了; 樓主你的程序就是重復(fù)往SBUF灌數(shù)據(jù),等到灌了(gbsednum==16)以后又重新開(kāi)始灌了。你的停止的條件永遠(yuǎn)沒(méi)有出現(xiàn)…… dengm 前輩指點(diǎn)的 “if (gbsednum==16) //發(fā)送完畢 { gbsednum = 0; ES = 0 ; } ” 就是為了關(guān)閉串口中斷使能以達(dá)到停止的目的嘛 |
|
| 21樓: | >>參與討論 |
| 作者: fsaok 于 2005/5/21 15:51:00 發(fā)布:
。 對(duì)于串口來(lái)說(shuō),串口輸出結(jié)束后,就會(huì) TI = 1 ,產(chǎn)生一個(gè)中斷 樓主的程序中, if(TI) // 發(fā)送中斷函數(shù) 依次發(fā)送16個(gè)字節(jié) { TI=0; if ((gbsednum<16)&&(gbsednum>=0)) SBUF = data_send[gbsednum++]; // 將一個(gè)字節(jié)發(fā)送完畢之后TI 置1 if (gbsednum==16) //發(fā)送完畢 { gbsednum = 0; } } 當(dāng)gbsednum = 16 時(shí),實(shí)際上,還有一個(gè)字節(jié)沒(méi)有發(fā)完,gbsednum 又被恢復(fù)為0,等最后一個(gè)字節(jié)發(fā)送后,再進(jìn)入中斷時(shí),gbsednum 已經(jīng)是 0,所以程序在重新開(kāi)始發(fā)送, 解決方法是 if ((gbsednum < 16 ) SBUF = data_send[gbsednum++];// 當(dāng)gbsednum = 15時(shí),變?yōu)?16; else gbsednum = 0; |
|
| 22樓: | >>參與討論 |
| 作者: hollly 于 2005/5/21 18:48:00 發(fā)布:
少了一個(gè)字節(jié)啊 而且我發(fā)現(xiàn)第一次發(fā)送的是16個(gè)字節(jié) 從第二次以后都發(fā)送的是15個(gè)字節(jié) 在串口調(diào)試工具這看到的都是15個(gè)字節(jié) 看到的是少了第一個(gè)。! 很奇怪哦~~ 怎么回師呢? |
|
| 23樓: | >>參與討論 |
| 作者: hollly 于 2005/5/21 19:51:00 發(fā)布:
最后完全正確的程序 中斷發(fā)送程序 if(TI) // 發(fā)送中斷函數(shù) 依次發(fā)送16個(gè)字節(jié) { TI=0; if(!gbsendfinshed) { //TI =0; //RE_DE=1; //設(shè)置485模塊為發(fā)送狀態(tài) if (gbsednum<16) SBUF = data_sen[gbsednum++]; // 將一個(gè)字節(jié)發(fā)送完畢之后TI 置1 if (gbsednum==16) //最后一個(gè)字節(jié)發(fā)送完畢之后 { gbsendfinshed =1; //置標(biāo)志位 gbsednum = 0; //ES = 0; //RE_DE=0; //設(shè)置485模塊為接收狀態(tài) } else { //TI =0; gbsendfinshed = 0; } } } 把TI=0;放到外邊 否則最后一個(gè)字節(jié)發(fā)送完畢之后 沒(méi)有TI = 0; 這個(gè)可真讓我郁悶的 好了 謝謝各位 |
|
|
|
| 免費(fèi)注冊(cè)為維庫(kù)電子開(kāi)發(fā)網(wǎng)會(huì)員,參與電子工程師社區(qū)討論,點(diǎn)此進(jìn)入 |
Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號(hào) |