標題: STC15W204S單片機串口程序哪里有問題?無論發(fā)送什么,都只是返回 沒有接收數(shù)據(jù) [打印本頁]

作者: chaoself    時間: 2023-11-25 00:53
標題: STC15W204S單片機串口程序哪里有問題?無論發(fā)送什么,都只是返回 沒有接收數(shù)據(jù)
如上代碼,發(fā)送A03_Ligt01Off_#沒反應,無論發(fā)送什么,都只是返回“沒有接收數(shù)據(jù)!”。請問代碼是哪里出錯了?

  1. #include "stc15.h"
  2. #include"periphs.h"
  3. #include"typedefs.h"

  4. uchar BYTE;
  5. uint  WORD;
  6. char RecvString_buf[16];            //定義數(shù)據(jù)包長度為15個字符
  7. #define datapackage_headflag 'A'        //用于串口通信時,定義數(shù)據(jù)包頭部的驗證標記

  8.         
  9. #define FOSC 11059200L          //系統(tǒng)頻率
  10. #define BAUD 9600               //串口波特率

  11. void UartInit(void)                //9600bps@11.0592MHz
  12. {
  13.         SCON = 0x50;                //8位可變波特率 串口工作模式1
  14.         T2L = (65536 - (FOSC/4/BAUD));   //設置波特率重裝值
  15.         T2H = (65536 - (FOSC/4/BAUD))>>8;
  16.         AUXR = 0x14;                //T2為1T模式, 并啟動定時器2
  17.     AUXR |= 0x01;               //選擇定時器2為串口1的波特率發(fā)生器
  18.         ES = 1;                     //使能串口1中斷
  19.         EA = 1;
  20. }
  21. /*----------------------------
  22. 發(fā)送串口數(shù)據(jù)
  23. ----------------------------*/
  24. void SendData(uchar dat)
  25. {
  26.         SBUF = dat;
  27.         while(TI == 0);
  28.         TI = 0;
  29. }

  30. /*----------------------------
  31. 發(fā)送字符串
  32. ----------------------------*/
  33. void SendString(char *s)
  34. {
  35.     while (*s)                  //檢測字符串結(jié)束標志
  36.     {
  37.         SendData(*s++);         //發(fā)送當前字符
  38.     }
  39. }
  40. //串口接收函數(shù)
  41. __bit ReceiveString()
  42. {
  43.     char * RecStr=RecvString_buf;
  44.     char num=0;
  45.     unsigned char count=0;
  46.     loop:
  47.     *RecStr=SBUF;
  48.     count=0;
  49.     RI=0;
  50.     if(num<14)  //數(shù)據(jù)包長度為15個字符,嘗試連續(xù)接收15個字符
  51.     {
  52.         num++;
  53.         RecStr++;
  54.         while(!RI)
  55.         {
  56.             count++;
  57.             if(count>130)return 0;    //接收數(shù)據(jù)等待延遲,等待時間太久會導致CPU運算閑置,太短會出現(xiàn)"數(shù)據(jù)包被分割",默認count=130
  58.         }
  59.         goto loop;
  60.     }
  61.     return 1;
  62. }
  63. __bit Deal_UART_RecData()   //處理串口接收數(shù)據(jù)包函數(shù)(成功處理數(shù)據(jù)包則返回1,否則返回0)
  64. {
  65.         if(RecvString_buf[0]==datapackage_headflag&&RecvString_buf[14]=='#')
  66.         {
  67.         if(RecvString_buf[1]=='0')
  68.                 {
  69.                         LED=1;
  70.                         SendString("發(fā)送成功!\r\n");
  71.                 }
  72.                 else
  73.                 {
  74.                         LED=0;
  75.                         SendString("發(fā)送失敗!\r\n");
  76.                 }
  77.         }
  78.         return 0;
  79. }

  80. /*----------------------------
  81. UART 中斷服務程序
  82. -----------------------------*/
  83. void Uart() __interrupt(4)
  84. {        
  85.         if(ReceiveString())
  86.     {
  87.         //數(shù)據(jù)包長度正確則執(zhí)行以下代碼
  88.         Deal_UART_RecData();
  89.     }
  90.     else
  91.     {
  92.         //數(shù)據(jù)包長度錯誤則執(zhí)行以下代碼
  93.         //LED=!LED;
  94.                 SendString("沒有接收數(shù)據(jù)!\r\n");
  95.     }
  96.     RI=0;  //接收并處理一次數(shù)據(jù)后把接收中斷標志清除一下,拒絕響應在中斷接收忙的時候發(fā)來的請求
  97. }

  98. /***************************
  99.         主函數(shù)
  100. ***************************/
  101. void main()
  102. {        
  103.         EA=1;
  104.         UartInit();
  105.         while(1);
  106. }
復制代碼



作者: aking991    時間: 2023-11-25 09:19
你的中斷處理程序不對,比如那個num這個變量,你無論怎么運行它都是0,建議你修改中斷處理程序,中斷里只負責接收存入緩存,當接收完一幀數(shù)據(jù)后再利用起時機制在主程序中判斷接收的數(shù)據(jù)是否你想要的
作者: coody_sz    時間: 2023-11-25 21:31
可以參考測試STC官方的例程,串口1使用定時器2的程序,STC-ISP里的范例程序就有,可以直接下載HEX文件測試。
作者: hy47566398    時間: 2023-11-27 17:30
while(!RI) 里加個Delay()試試




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1