欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

標題: STC8A單片機通過串口寫入數據存到EEPROM,兩條命令單獨運行正常,一起運行有一條me... [打印本頁]

作者: 貪吃的老鱷魚    時間: 2020-9-20 22:35
標題: STC8A單片機通過串口寫入數據存到EEPROM,兩條命令單獨運行正常,一起運行有一條me...
STC8A單片機通過串口寫入數據存到EEPROM,兩條命令單獨運行正常,一起運行有一條能運行
CF 01 04 FD這條命令執行不了
單片機源程序如下:
  1. #include "Uart.h"

  2. bit   busy;          //判忙標志
  3. uchar idata SinBuf[20];    //接收緩沖區
  4. uint  SinP;          //接收指針
  5. uchar idata SoutBuf[20];   //發送緩沖區

  6. uint  SoutP;         //發送指針

  7. uchar Send_OK,Sin_OK;       //發送完成標志
  8. U32   Ul_Value,RXDATA,ADDR_485;      //超聲波值
  9. /**************************************初始化串口********************************************/
  10. void UartInit(void)
  11. {
  12.     SCON = 0x50;
  13.     T2L = BRT;
  14.     T2H = BRT >> 8;
  15.     AUXR = 0x15;

  16.     busy = 0;

  17.     ES = 1;
  18.           EA = 1;
  19. }
  20. /**************************************串口服務函數*******************************************/

  21. void ReceiveChar (void) interrupt 4 using 3
  22. {
  23.   uchar ch;
  24.         uchar idata Start=0xCF;//幀頭;
  25.         uchar idata End=0xFD;//幀尾;  


  26.         static bit bReceiveAdr= 0;    //接收地址標志  
  27.         uchar ucharAdr;//存放地址;

  28.         static bit bReceiveCmd= 0;    //接收命令標志  
  29.         uchar ucharCmd;         //存放命令;  

  30.         static bit bReceiveEnd=0;//接收幀尾標志;
  31.         bit bReceiveComplete=0;    //收到一個完整的數據包(導引頭+地址+數據+幀尾)例:CF 00 04 FD


  32. //*********************
  33.   if (RI)
  34.   {
  35.   ES = 0;
  36.   RI = 0;
  37.   ch=SBUF;
  38.                
  39.   SinBuf[SinP]=ch;
  40.   SinP= SinP+1;
  41.         SW_Ctrl  = 0;

  42. if(ch==Start)//如果收到幀頭;
  43.                 {
  44.                         bReceiveAdr=1;//接收地址標志1,準備接收地址;
  45.                         bReceiveComplete=0;// 完整幀數據包狀態為0;
  46.                         
  47.                 }
  48.                 else if(bReceiveAdr==1)//開始接收地址
  49.                 {        ucharAdr=SinBuf[2];
  50.                         bReceiveAdr=0;//清除地址標志;
  51.                         bReceiveCmd=1;//準備接收命令;
  52.                 }
  53.                 else if(bReceiveCmd==1)//開始接收命令;
  54.                 {        ucharCmd=ch;
  55.                         bReceiveCmd=0;
  56.                         bReceiveEnd=1;
  57.                 }
  58.                 else if(bReceiveEnd ==1 &&(SinBuf[3]==End))//如果幀尾是End;//就代表一幀數據包完成;
  59.             {        bReceiveComplete=1;
  60.                 }

  61.                 else//收到干擾;
  62.                 {
  63.                         bReceiveAdr=0;
  64.                         bReceiveCmd=0;
  65.                         bReceiveEnd=0;
  66.                         bReceiveComplete=0;
  67.                         //ucharAdr=0;
  68.                 }

  69.                 if(bReceiveComplete ==1)//如果有完整的數據包;
  70.                 {

  71.                          if(SinBuf[2]==0x04)//查詢  //如果是查詢命令,就把對應的地址位的值取回來,按格式發回上位機;
  72.                         {        
  73.                                 
  74.                                 CommandType();

  75.       SinP= 0;
  76.                         Sin_OK = 1;
  77.                
  78.                

  79.                         }
  80.                         
  81.                 }
  82.          if (SinBuf[0] != 0x06 )
  83.         {
  84.     SinP= 0;
  85.     SinBuf[1] = 0;

  86.     }
  87.   if ((SinP == 8)&& (SinBuf[3] == 0x00))//修改這行可更換寄存器地址
  88.     {
  89.     SinP= 0;
  90.     Send_OK = 1;
  91.                         //return;

  92.         }

  93.   ES = 1;
  94.   }
  95.         
  96.   if (TI)//發送----------------
  97.   {
  98.                 ES = 0;
  99.                 TI = 0;

  100.    if (SoutP < 7)
  101.     {
  102.     SBUF = SoutBuf[SoutP];
  103.     SoutP= SoutP+ 1;
  104.     }
  105.         }
  106.   else
  107.     {
  108.     SW_Ctrl = 0;
  109.     SoutP=1;//發送指針歸零
  110.                
  111.     }
  112.         
  113.                 ES = 1;
  114.   }//發送


  115. /**************************************發送03號指令*******************************************/
  116. void Respond03(void)
  117. {
  118.   unsigned int x;
  119.   unsigned int i ;
  120.   SoutBuf[0] = 0x06;//
  121.   SoutBuf[1] = 0x03;//A型號:01,B型號:02
  122.   SoutBuf[2] = 0x02;
  123.   SoutBuf[3] = ((Ul_Value & 0xFF00)>>8);
  124.   SoutBuf[4] = (Ul_Value & 0x00FF);
  125.   x = 0xffff;
  126.   for (i = 0;i<5 ; i++)
  127.   x = CRC_modbus_rtu(x,SoutBuf[i]);

  128.   SoutBuf[5] = (x & 0x00FF);
  129.   SoutBuf[6] = ((x & 0xFF00)>>8);

  130.   SoutP = 1;
  131.   SW_Ctrl = 1;
  132.   SBUF = 0x06;//啟動中斷發送
  133. }

  134. /*-------------------------------------------------------------
  135. 調用方式:void CommandType(void)
  136. 函數說明:
  137. ---------------------------------------------------------------*/
  138. void CommandType(void)
  139. {
  140. //  uchar CommandLong;
  141. //  CommandLong = SinBuf[1];
  142. //  if (SinBuf[0] != 0xCF)
  143. //    return;
  144. //  if (SinBuf[CommandLong - 1] != 0xFD)
  145. //    return;
  146.   switch (SinBuf[1])
  147.     {
  148.     case 0x01://采集器發送請求
  149.       {
  150.       RXDATA = 0x01;
  151.                   IapErase(0x0400);                         //擦除0400扇區數據         
  152.             IapProgram(0x0400, RXDATA);                    //在0400寫入數據        
  153.       break;
  154.       }
  155.     case 0x02:
  156.       {
  157.        RXDATA = 0x02;
  158.                    IapErase(0x0400);                         //擦除0400扇區數據         
  159.              IapProgram(0x0400, RXDATA);                    //在0400寫入數據        
  160.       break;
  161.       }
  162.        case 0x03:
  163.       {
  164.        RXDATA = 0x03;
  165.                    IapErase(0x0400);                         //擦除0400扇區數據         
  166.              IapProgram(0x0400, RXDATA);                    //在0400寫入數據        
  167.       break;
  168.       }    case 0x04:
  169.       {
  170.        RXDATA = 0x04;
  171.                    IapErase(0x0400);                         //擦除0400扇區數據         
  172.              IapProgram(0x0400, RXDATA);                    //在0400寫入數據        
  173.       break;
  174.       }    case 0x05:
  175.       {
  176.        RXDATA = 0x05;
  177.                    IapErase(0x0400);                         //擦除0400扇區數據         
  178.              IapProgram(0x0400, RXDATA);                    //在0400寫入數據        
  179.       break;
  180.       }    case 0x06:
  181.       {
  182.        RXDATA = 0x06;
  183.                    IapErase(0x0400);                         //擦除0400扇區數據         
  184.              IapProgram(0x0400, RXDATA);                    //在0400寫入數據        
  185.       break;
  186.       }    case 0x07:
  187.       {
  188.        RXDATA = 0x07;
  189.                    IapErase(0x0400);                         //擦除0400扇區數據         
  190.              IapProgram(0x0400, RXDATA);                    //在0400寫入數據        
  191.       break;
  192.       }    case 0x08:
  193.       {
  194.        RXDATA = 0x08;
  195.                    IapErase(0x0400);                         //擦除0400扇區數據         
  196.              IapProgram(0x0400, RXDATA);                    //在0400寫入數據        
  197.       break;
  198.       }    case 0x09:
  199.       {
  200.        RXDATA = 0x09;
  201.                    IapErase(0x0400);                         //擦除0400扇區數據         
  202.              IapProgram(0x0400, RXDATA);                    //在0400寫入數據        
  203.       break;
  204.       }    case 0x0A:
  205.       {
  206.        RXDATA = 0x0A;
  207.                    IapErase(0x0400);                         //擦除0400扇區數據         
  208.              IapProgram(0x0400, RXDATA);                    //在0400寫入數據        
  209.       break;
  210.       }
  211.     }
  212. }
  213. void Respond01(void)
  214. {
  215.   ADDR_485 =         RXDATA;
  216.   SoutBuf[0] = 0xCF;//
  217.   SoutBuf[1] = ADDR_485;//A型號:01,B型號:02
  218.   SoutBuf[2] = 0x04;
  219.   SoutBuf[3] = 0xFD;
  220.   SoutP = 1;
  221.   SW_Ctrl = 1;
  222.   SBUF = 0xCF;//啟動中斷發送
  223. }
  224. void Respond02(void)
  225. {

  226.   SoutBuf[0] = 0xCF;//
  227.   SoutBuf[1] = ADDR_485;//A型號:01,B型號:02
  228.   SoutBuf[2] = 0x04;
  229.   SoutBuf[3] = 0xFD;
  230.   SoutP = 1;
  231.   SW_Ctrl = 1;
  232.   SBUF = 0xCF;//啟動中斷發送
  233. }
復制代碼

3.png (32.07 KB, 下載次數: 66)

3.png

4.png (14.46 KB, 下載次數: 61)

4.png

2.png (59.74 KB, 下載次數: 71)

2.png

1.png (50.81 KB, 下載次數: 89)

1.png

Uart.rar

2.16 KB, 下載次數: 10

串口部分


作者: aking991    時間: 2020-9-21 08:33
提醒一下,串口接收中斷處理要時間,你發兩條要能滿足它的處理時間它才會接收處理,另外寫EEPROM處理也需要時間,把這些時間差錯開就沒有問題了,比如你要連續發,在這兩條中間發時加一些延時,這樣串口中斷有時間處理數據并存儲就可以完成你要的結果了
作者: 貪吃的老鱷魚    時間: 2020-9-21 19:10
aking991 發表于 2020-9-21 08:33
提醒一下,串口接收中斷處理要時間,你發兩條要能滿足它的處理時間它才會接收處理,另外寫EEPROM處理也需要 ...

并不是延時的問題,是CF 04 04 FD,和06 03 40 00 00 01 9D 7F這兩條分別運行可以,但是兩條同時運行只有06 03 40 00 00 01 9D 7F可以運行,CF 04 04 FD不能運行。暫時沒有找到原因




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