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

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

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

STC8A單片機(jī)通過串口寫入數(shù)據(jù)存到EEPROM,兩條命令單獨(dú)運(yùn)行正常,一起運(yùn)行有一條me...

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
80黑幣
STC8A單片機(jī)通過串口寫入數(shù)據(jù)存到EEPROM,兩條命令單獨(dú)運(yùn)行正常,一起運(yùn)行有一條能運(yùn)行
CF 01 04 FD這條命令執(zhí)行不了
單片機(jī)源程序如下:
  1. #include "Uart.h"

  2. bit   busy;          //判忙標(biāo)志
  3. uchar idata SinBuf[20];    //接收緩沖區(qū)
  4. uint  SinP;          //接收指針
  5. uchar idata SoutBuf[20];   //發(fā)送緩沖區(qū)

  6. uint  SoutP;         //發(fā)送指針

  7. uchar Send_OK,Sin_OK;       //發(fā)送完成標(biāo)志
  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. /**************************************串口服務(wù)函數(shù)*******************************************/

  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;    //接收地址標(biāo)志  
  27.         uchar ucharAdr;//存放地址;

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

  30.         static bit bReceiveEnd=0;//接收幀尾標(biāo)志;
  31.         bit bReceiveComplete=0;    //收到一個(gè)完整的數(shù)據(jù)包(導(dǎo)引頭+地址+數(shù)據(jù)+幀尾)例: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;//接收地址標(biāo)志1,準(zhǔn)備接收地址;
  45.                         bReceiveComplete=0;// 完整幀數(shù)據(jù)包狀態(tài)為0;
  46.                         
  47.                 }
  48.                 else if(bReceiveAdr==1)//開始接收地址
  49.                 {        ucharAdr=SinBuf[2];
  50.                         bReceiveAdr=0;//清除地址標(biāo)志;
  51.                         bReceiveCmd=1;//準(zhǔn)備接收命令;
  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;//就代表一幀數(shù)據(jù)包完成;
  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)//如果有完整的數(shù)據(jù)包;
  70.                 {

  71.                          if(SinBuf[2]==0x04)//查詢  //如果是查詢命令,就把對(duì)應(yīng)的地址位的值取回來,按格式發(fā)回上位機(jī);
  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)//發(fā)送----------------
  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;//發(fā)送指針歸零
  110.                
  111.     }
  112.         
  113.                 ES = 1;
  114.   }//發(fā)送


  115. /**************************************發(fā)送03號(hào)指令*******************************************/
  116. void Respond03(void)
  117. {
  118.   unsigned int x;
  119.   unsigned int i ;
  120.   SoutBuf[0] = 0x06;//
  121.   SoutBuf[1] = 0x03;//A型號(hào):01,B型號(hào):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;//啟動(dòng)中斷發(fā)送
  133. }

  134. /*-------------------------------------------------------------
  135. 調(diào)用方式:void CommandType(void)
  136. 函數(shù)說明:
  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://采集器發(fā)送請(qǐng)求
  149.       {
  150.       RXDATA = 0x01;
  151.                   IapErase(0x0400);                         //擦除0400扇區(qū)數(shù)據(jù)         
  152.             IapProgram(0x0400, RXDATA);                    //在0400寫入數(shù)據(jù)        
  153.       break;
  154.       }
  155.     case 0x02:
  156.       {
  157.        RXDATA = 0x02;
  158.                    IapErase(0x0400);                         //擦除0400扇區(qū)數(shù)據(jù)         
  159.              IapProgram(0x0400, RXDATA);                    //在0400寫入數(shù)據(jù)        
  160.       break;
  161.       }
  162.        case 0x03:
  163.       {
  164.        RXDATA = 0x03;
  165.                    IapErase(0x0400);                         //擦除0400扇區(qū)數(shù)據(jù)         
  166.              IapProgram(0x0400, RXDATA);                    //在0400寫入數(shù)據(jù)        
  167.       break;
  168.       }    case 0x04:
  169.       {
  170.        RXDATA = 0x04;
  171.                    IapErase(0x0400);                         //擦除0400扇區(qū)數(shù)據(jù)         
  172.              IapProgram(0x0400, RXDATA);                    //在0400寫入數(shù)據(jù)        
  173.       break;
  174.       }    case 0x05:
  175.       {
  176.        RXDATA = 0x05;
  177.                    IapErase(0x0400);                         //擦除0400扇區(qū)數(shù)據(jù)         
  178.              IapProgram(0x0400, RXDATA);                    //在0400寫入數(shù)據(jù)        
  179.       break;
  180.       }    case 0x06:
  181.       {
  182.        RXDATA = 0x06;
  183.                    IapErase(0x0400);                         //擦除0400扇區(qū)數(shù)據(jù)         
  184.              IapProgram(0x0400, RXDATA);                    //在0400寫入數(shù)據(jù)        
  185.       break;
  186.       }    case 0x07:
  187.       {
  188.        RXDATA = 0x07;
  189.                    IapErase(0x0400);                         //擦除0400扇區(qū)數(shù)據(jù)         
  190.              IapProgram(0x0400, RXDATA);                    //在0400寫入數(shù)據(jù)        
  191.       break;
  192.       }    case 0x08:
  193.       {
  194.        RXDATA = 0x08;
  195.                    IapErase(0x0400);                         //擦除0400扇區(qū)數(shù)據(jù)         
  196.              IapProgram(0x0400, RXDATA);                    //在0400寫入數(shù)據(jù)        
  197.       break;
  198.       }    case 0x09:
  199.       {
  200.        RXDATA = 0x09;
  201.                    IapErase(0x0400);                         //擦除0400扇區(qū)數(shù)據(jù)         
  202.              IapProgram(0x0400, RXDATA);                    //在0400寫入數(shù)據(jù)        
  203.       break;
  204.       }    case 0x0A:
  205.       {
  206.        RXDATA = 0x0A;
  207.                    IapErase(0x0400);                         //擦除0400扇區(qū)數(shù)據(jù)         
  208.              IapProgram(0x0400, RXDATA);                    //在0400寫入數(shù)據(jù)        
  209.       break;
  210.       }
  211.     }
  212. }
  213. void Respond01(void)
  214. {
  215.   ADDR_485 =         RXDATA;
  216.   SoutBuf[0] = 0xCF;//
  217.   SoutBuf[1] = ADDR_485;//A型號(hào):01,B型號(hào):02
  218.   SoutBuf[2] = 0x04;
  219.   SoutBuf[3] = 0xFD;
  220.   SoutP = 1;
  221.   SW_Ctrl = 1;
  222.   SBUF = 0xCF;//啟動(dòng)中斷發(fā)送
  223. }
  224. void Respond02(void)
  225. {

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

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

3.png

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

4.png

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

2.png

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

1.png

Uart.rar

2.16 KB, 下載次數(shù): 10

串口部分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:65956 發(fā)表于 2020-9-21 08:33 | 只看該作者
提醒一下,串口接收中斷處理要時(shí)間,你發(fā)兩條要能滿足它的處理時(shí)間它才會(huì)接收處理,另外寫EEPROM處理也需要時(shí)間,把這些時(shí)間差錯(cuò)開就沒有問題了,比如你要連續(xù)發(fā),在這兩條中間發(fā)時(shí)加一些延時(shí),這樣串口中斷有時(shí)間處理數(shù)據(jù)并存儲(chǔ)就可以完成你要的結(jié)果了
回復(fù)

使用道具 舉報(bào)

板凳
ID:411221 發(fā)表于 2020-9-21 19:10 | 只看該作者
aking991 發(fā)表于 2020-9-21 08:33
提醒一下,串口接收中斷處理要時(shí)間,你發(fā)兩條要能滿足它的處理時(shí)間它才會(huì)接收處理,另外寫EEPROM處理也需要 ...

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

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 久久久久久久久久久久久久久久久久久久 | 欧美电影大全 | 亚洲成人自拍 | 精品国产一区二区三区日日嗨 | 羞羞在线视频 | 97免费在线视频 | 国产精品视屏 | 国产精品久久久久一区二区三区 | 91精品国产综合久久久久久 | 国产精品1区2区3区 一区中文字幕 | 国产在线一区观看 | 久久九九免费 | 精品欧美一区二区三区久久久 | 天天综合网天天综合 | 久久精品超碰 | 亚洲精品一区二区在线 | 在线欧美日韩 | 国产精品无码久久久久 | 亚洲欧美日韩在线一区二区 | 黑人精品欧美一区二区蜜桃 | 亚洲日本中文字幕在线 | 91精品免费视频 | 一区二区三区精品视频 | 亚洲在线电影 | 色婷婷在线视频 | 国产成人在线免费 | 欧美激情精品久久久久久变态 | 99热播精品| 欧美xxxx色视频在线观看免费 | 色婷婷综合久久久中文字幕 | 天天干夜夜操视频 | 久久久久无码国产精品一区 | 久久久一区二区 | 毛片一区 | 99久久精品国产一区二区三区 | 国产精品久久国产精品久久 | 久久精品亚洲精品国产欧美 | 精品日韩一区二区三区 | 在线a视频 | 欧美性一区二区三区 | 国产99热 |