久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1781|回復(fù): 5
打印 上一主題 下一主題
收起左側(cè)

51單片機(jī)串口中斷程序邏輯問題求助

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:453144 發(fā)表于 2019-11-4 21:36 | 只看該作者 回帖獎勵 |倒序?yàn)g覽 |閱讀模式
為什么串口中斷這里用if判斷就可以發(fā)送數(shù)組里的全部數(shù)據(jù),而用while循環(huán)就只能發(fā)送出一位數(shù)據(jù)。感覺邏輯上走不通啊,求大神講解一下

單片機(jī)源程序如下:
  1. #include <reg52.h>
  2. #define uint unsigned int
  3. #define uchar unsigned char
  4.         
  5. bit cmdArrived = 0; //命令到達(dá)flag
  6. uchar cmdIndex = 0;
  7. uchar *ptrTxd ;
  8. uchar cmdTxd = 0;

  9. uchar arry1[] = "1-HELLO!\r\n";
  10. uchar arry2[] = {1,2};
  11. uchar arry3[] = {1,2,3,4};
  12. uchar arry4[] = {1,2,3,4,5,6,7,8};

  13. void ConfigUART(uint baud);
  14. int main(void)
  15. {
  16.         EA = 1;
  17.         ConfigUART(9600);
  18.         
  19.         while(1)
  20.         {
  21.                 if(cmdArrived)
  22.                 {
  23.                         cmdArrived = 0;
  24.                         switch(cmdIndex)
  25.                         {
  26.                         case 1:  ptrTxd = arry1;
  27.                                                         cmdTxd        = sizeof(arry1);  //發(fā)幾個字節(jié)               
  28.                                                         TI = 1;
  29.                                                         break;
  30.                         case 2:  ptrTxd = arry2;
  31.                                                         cmdTxd        = sizeof(arry2);  //發(fā)幾個字節(jié)               
  32.                                                         TI = 1;
  33.                                                         break;
  34.                         case 3:  ptrTxd = arry3;
  35.                                                         cmdTxd        = sizeof(arry3);  //發(fā)幾個字節(jié)               
  36.                                                         TI = 1;
  37.                                                         break;
  38.                         case 4:  ptrTxd = arry4;
  39.                                                         cmdTxd        = sizeof(arry4);  //發(fā)幾個字節(jié)               
  40.                                                         TI = 1;
  41.                                                         break;
  42.                         default: break;
  43.                         }
  44.                         
  45.                 }
  46.         }
  47.         return 0;
  48. }

  49. void ConfigUART(uint baud)
  50. {
  51.         SCON = 0X50;
  52.         TMOD &= 0X0F;
  53.         TMOD |= 0X20;
  54.         //TMOD = 0X20;
  55.         TL1 = TH1 = 256-(11059200/12/2/16)/baud;
  56.         ET1 = 0;  //強(qiáng)調(diào)T1做波特率發(fā)生器時(shí)不能做別的事情
  57.         TR1 = 1;
  58.         ES =1;
  59. }

  60. void interrupttimer() interrupt 4
  61. {
  62.         //static uchar cnt = 0;
  63.         
  64.         if(RI)
  65.         {
  66.                  RI = 0;
  67.                  cmdIndex = SBUF;
  68.                  cmdArrived = 1;
  69.         }
  70.         if(TI)
  71.         {
  72.                 TI = 0;
  73.                 if(cmdTxd > 0)
  74.                 {
  75.                                 SBUF = *ptrTxd;
  76.                                 cmdTxd--;
  77.                                 ptrTxd++;
  78.                 }
  79.                
  80.         }
  81. }
復(fù)制代碼
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:635290 發(fā)表于 2019-11-5 08:33 | 只看該作者
BUFF里面一有內(nèi)容就會產(chǎn)生中斷
回復(fù)

使用道具 舉報(bào)

板凳
ID:631219 發(fā)表于 2019-11-5 10:10 | 只看該作者
本帖最后由 oldwood_hmgh 于 2019-11-5 11:36 編輯
dcr1105 發(fā)表于 2019-11-5 08:33
BUFF里面一有內(nèi)容就會產(chǎn)生中斷

不完全是這樣,接收時(shí)SBUFF里面有可用的內(nèi)容就會產(chǎn)生中斷,這時(shí)RI置位。發(fā)送時(shí)SBUFF發(fā)送完一個字節(jié)變成空的時(shí)才產(chǎn)生中斷,此時(shí)TI置位,請求主機(jī)繼續(xù)發(fā)送或終止發(fā)送。由于發(fā)送和接收使用同一個中斷號,所以中斷服務(wù)程序里必須判斷是TI置位還是RI置位,作出相應(yīng)處理。
回復(fù)

使用道具 舉報(bào)

地板
ID:213173 發(fā)表于 2019-11-5 11:53 | 只看該作者
用while循環(huán)發(fā)送數(shù)組中字符串是以下標(biāo)超出為0來判斷結(jié)束。如果發(fā)送不含0的數(shù)字串也是可以的,因?yàn)橛?就會跳出。要在末尾加0,否則會出錯。
程序改這樣試試。
  1. #include<reg52.h>

  2. #define uchar unsigned char
  3. #define uint unsigned int

  4. uchar arry1[] = "1-HELLO!\r\n";  //文本模式接收
  5. uchar arry2[] = {1,2,0};                        //HEX 模式接收
  6. uchar arry3[] = {1,2,3,4,0};
  7. uchar arry4[] = {1,2,3,4,5,6,7,8,0};

  8. uchar *ptrTxd;
  9. uchar cmdTxd = 0;

  10. void ConfigUART()
  11. {
  12.         SCON = 0x50;
  13.         TMOD = 0x20;
  14.         TH1 = 0xfd;
  15.         TL1 = 0xfd;
  16.         TR1 = 1;
  17.         ET1 = 0;
  18.         EA = 1;
  19.         ES =1;
  20. }

  21. void Send_byte(uchar dat)
  22. {
  23.         SBUF = dat;
  24.         while(!TI);
  25.         TI = 0;
  26. }

  27. void Send_string(uchar *p)
  28. {
  29.         while(*p)
  30.         {
  31.                 Send_byte(*p++);
  32.         }
  33. }
  34. void main(void)
  35. {
  36.         ConfigUART();
  37.         while(1);
  38. }
  39. void interrupttimer() interrupt 4
  40. {
  41.         RI = 0;
  42.         cmdTxd=SBUF;
  43.         switch(cmdTxd)
  44.         {
  45.                 case 1:ptrTxd=arry1;Send_string(ptrTxd);break;
  46.                 case 2:ptrTxd=arry2;Send_string(ptrTxd);break;
  47.                 case 3:ptrTxd=arry3;Send_string(ptrTxd);break;
  48.                 case 4:ptrTxd=arry4;Send_string(ptrTxd);break;
  49.                 default: break;
  50.         }
  51. }
復(fù)制代碼
回復(fù)

使用道具 舉報(bào)

5#
ID:453144 發(fā)表于 2019-11-5 23:17 | 只看該作者
wulin 發(fā)表于 2019-11-5 11:53
用while循環(huán)發(fā)送數(shù)組中字符串是以下標(biāo)超出為0來判斷結(jié)束。如果發(fā)送不含0的數(shù)字串也是可以的,因?yàn)橛?就會跳 ...

我這里原程序是使用字符串長度作為判斷標(biāo)準(zhǔn)的,當(dāng)長度值減到0時(shí)完成發(fā)送,我不太明白是if作為一個判斷語句,為什么可以讓串口把信息都發(fā)送出來,不是應(yīng)該進(jìn)入一次中斷后就只發(fā)出一個字節(jié)嗎
回復(fù)

使用道具 舉報(bào)

6#
ID:213173 發(fā)表于 2019-11-6 06:48 | 只看該作者
q977165 發(fā)表于 2019-11-5 23:17
我這里原程序是使用字符串長度作為判斷標(biāo)準(zhǔn)的,當(dāng)長度值減到0時(shí)完成發(fā)送,我不太明白是if作為一個判斷語 ...

是因?yàn)槌绦蛑邪驯緛響?yīng)該由硬件置1的TI中斷請求標(biāo)志錯誤的用軟件置1導(dǎo)致重復(fù)發(fā)生中斷。
正常操作是:
SBUF = *ptrTxd; //發(fā)送一個字節(jié)
while(!TI);//等待發(fā)送結(jié)束,硬件置TI為1
TI = 0;   //軟件清0
回復(fù)

使用道具 舉報(bào)

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 一区二区免费 | 高清免费在线 | 精品欧美激情在线观看 | 亚洲成人高清 | 第一福利社区1024 | 毛片免费看的 | 婷婷久久一区 | 国产精品久久a | 国产精品久久99 | 欧美高清视频一区 | 日韩中文字幕一区二区 | www久久av| 成人免费在线观看视频 | 久久精品国产清自在天天线 | 国产精品18hdxxxⅹ在线 | 亚洲综合在线视频 | 精品福利在线 | 亚洲色图在线观看 | 男人的天堂在线视频 | 91玖玖| 国产精品久久久久久久久久久新郎 | 日韩一级不卡 | 国产99久久精品一区二区300 | 日本免费一区二区三区视频 | 成人午夜毛片 | 少妇一级淫片免费放播放 | 亚洲精品9999 | 三级成人在线 | 日韩欧美在线免费观看 | 福利视频大全 | 国产欧美精品区一区二区三区 | 91精品国产综合久久婷婷香蕉 | 亚洲成人av一区二区 | 亚洲36d大奶网 | 国产精品福利视频 | 精品国产精品国产偷麻豆 | 国产精品自产拍 | 91精品国产91久久久久游泳池 | 国外成人在线视频网站 | 精品视频一区二区 | 91亚洲国产成人久久精品网站 |