音影先锋亚洲天堂网|电影世界尽头的爱完整版播放|国产 熟女 91|高清无码免费观看欧美日韩|韩国一区二区三区黄色录像|美女亚洲加勒比在线|亚洲综合网 开心五月|7x成人在线入口|成人网站免费日韩毛片区|国产黄片?一级?二级?三级

登錄 免費(fèi)注冊(cè) 首頁(yè) | 行業(yè)黑名單 | 幫助
維庫(kù)電子市場(chǎng)網(wǎng)
技術(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ī)
你的TI置1是在while(1)里面嗎?
“串口調(diào)試工具那就看到 發(fā)個(gè)沒(méi)完 不知道怎么回師就停不下來(lái)了 “,不明白什么意思。到底一直在發(fā)呢還是一回就停下來(lái)了。
而且,這句if (gbsednum==16) 根本起不到控制發(fā)送的作用。
總之,你說(shuō)得不清楚!

2樓: >>參與討論
水星
樓主,你的中斷服務(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樓: >>參與討論
水星
修改意見(jiàn)
   if (gbsednum==16)             //發(fā)送完畢
   {
       gbsednum = 0;
   }      
所干的活放到中斷服務(wù)程序外部去做

4樓: >>參與討論
hollly
我修改后的串口中斷發(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
串口中斷服務(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
RE:
 if (gbsednum==16)             //發(fā)送完畢
   {
       gbsednum = 0;
       ES = 0 ;
   }      

7樓: >>參與討論
HOLLLY
TO: dengm
關(guān)閉之后還怎么發(fā)?

8樓: >>參與討論
sujiechen
這樣試試看
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
我試了 還是不行
怪了 到底是設(shè)么原因呢?!  
一個(gè)串口都搞不定~~!!~~~

10樓: >>參與討論
hollly
有人知道嗎?
是不是我的編程思路有問(wèn)題呢? 懇求大蝦指點(diǎn)一二
小弟在此感激不盡拉

11樓: >>參與討論
sujiechen
我很久沒(méi)搞51了,忘得差不多了
 
12樓: >>參與討論
hj_sheng
應(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
我修改后出現(xiàn)的情況
接收到的是這個(gè)
f纊ff榝鄦?x鏋x瀈   
占23個(gè)字節(jié)
可是不應(yīng)該啊
我的發(fā)送緩沖是16個(gè)字節(jié)啊  
真奇怪  

14樓: >>參與討論
sujiechen
你這是亂碼,是波特率不對(duì)啊,再算一下吧
 
15樓: >>參與討論
艾森豪威爾
?

長(zhǎng)度開(kāi)始置為16.中斷里面判斷長(zhǎng)度如果大于0,發(fā)送.每發(fā)送一個(gè),長(zhǎng)度減1,減到零自然不發(fā)了.


16樓: >>參與討論
hollly
回復(fù)  sujiechen
大哥 你真了不起   
我在串口調(diào)試工具中改為4800  就可以出來(lái)了   完全正確的!!

可是為什么我以前就可以呢?也是這樣啊 就可以的 沒(méi)什么問(wèn)題的啊~~
奇怪  看來(lái)還得認(rèn)真看看

  謝謝各位!


17樓: >>參與討論
hotpower
(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
回復(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
設(shè)停止位為2位即可
 
20樓: >>參與討論
水星
樓主啊……
你重復(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
。
對(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
少了一個(gè)字節(jié)啊
而且我發(fā)現(xiàn)第一次發(fā)送的是16個(gè)字節(jié)
從第二次以后都發(fā)送的是15個(gè)字節(jié) 在串口調(diào)試工具這看到的都是15個(gè)字節(jié)
看到的是少了第一個(gè)。!
很奇怪哦~~ 怎么回師呢?

23樓: >>參與討論
hollly
最后完全正確的程序 中斷發(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è)可真讓我郁悶的

  好了 謝謝各位


參與討論
昵稱:
討論內(nèi)容:
 
 
相關(guān)帖子
7805穩(wěn)壓?jiǎn)栴}
請(qǐng)教一個(gè)指針問(wèn)題
請(qǐng)高手推薦一款USB HOST芯片
求助!哪位哥哥可以告訴我可控硅BTA06 600C的引腳圖嗎?
芯片CD4040求救~~~~~~~
免費(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)