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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1819|回復(fù): 5
收起左側(cè)

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

[復(fù)制鏈接]
ID:453144 發(fā)表于 2019-11-4 21:36 | 顯示全部樓層 |閱讀模式
為什么串口中斷這里用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ā)生器時不能做別的事情
  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ù)制代碼
回復(fù)

使用道具 舉報

ID:635290 發(fā)表于 2019-11-5 08:33 | 顯示全部樓層
BUFF里面一有內(nèi)容就會產(chǎn)生中斷
回復(fù)

使用道具 舉報

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)生中斷

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

使用道具 舉報

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ù)

使用道具 舉報

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時完成發(fā)送,我不太明白是if作為一個判斷語句,為什么可以讓串口把信息都發(fā)送出來,不是應(yīng)該進(jìn)入一次中斷后就只發(fā)出一個字節(jié)嗎
回復(fù)

使用道具 舉報

ID:213173 發(fā)表于 2019-11-6 06:48 | 顯示全部樓層
q977165 發(fā)表于 2019-11-5 23:17
我這里原程序是使用字符串長度作為判斷標(biāo)準(zhǔn)的,當(dāng)長度值減到0時完成發(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ù)

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 日韩成人在线播放 | a级黄色片在线观看 | 成人综合视频在线观看 | 日韩精品一区二区三区视频播放 | 免费在线观看成年人视频 | 免费福利视频一区二区三区 | 成人欧美一区二区三区黑人孕妇 | 精品一区二区三区av | 91欧美| 日日天天 | 成人妇女免费播放久久久 | 国产精品久久久久久久岛一牛影视 | 亚洲精品中文字幕在线观看 | 一区二区视频在线 | 精品国产乱码久久久久久蜜臀 | 蜜月aⅴ免费一区二区三区 99re在线视频 | 国产午夜精品久久久久 | 99视频免费在线 | 国产免费a视频 | av手机在线 | 毛片99 | 国产成人精品一区二区三 | 一区二区三区四区国产 | 亚州激情 | 蜜桃精品噜噜噜成人av | 一区观看 | 日韩一区二区在线观看视频 | 国产精品一区在线观看你懂的 | 免费的色网站 | 国产日韩欧美精品一区二区三区 | 国产美女精品视频 | 成人网在线观看 | 黄频视频 | 999在线精品 | 999国产精品视频免费 | 久久精品播放 | 国产成人免费观看 | 中文字幕欧美日韩一区 | 亚洲成人中文字幕 | 超碰高清 | 亚洲午夜精品一区二区三区他趣 |