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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4164|回復: 1
打印 上一主題 下一主題
收起左側

完整實際應用NXP modbus編程實例

[復制鏈接]
跳轉到指定樓層
樓主
完整實際應用NXP modbus編程實例。包括modbus協議,flash 編程


單片機源程序如下:

  1. #include "config.h"
  2. //                  unsigned int test=1200;
  3. CONFIG_TYPE         sysconfig;         //終端配置信息
  4. unsigned char gSendBuffer[GPRSBUFFERLEN];
  5. char gReceiveBuffer[GPRSBUFFERLEN];
  6. char DomainStr[30];
  7. char DomainStrl;
  8. char MyIPStr[30];
  9. char MyIPStrl;
  10. unsigned long gReceiveBufferLen = 0;
  11. unsigned char gReceiveFlag = 0;

  12. //創建多TCP鏈路
  13. typedef enum
  14. {        Link0,
  15.     Link1,
  16.     Link2,
  17.     Link3,
  18. }link_enum_type;
  19. void GPRS_OFF(void)
  20. {
  21.         SET_BIT(IODIR1,22);
  22.         SET_BIT(IOSET1,22);          //ON/OFF_GPRS
  23.         SET_BIT(IODIR1,16);
  24.         SET_BIT(IOCLR1,16); //GPRSVCC_EN
  25. }
  26. void GPRS_Init(void)
  27. {
  28.         /******GPRS啟動時序******/
  29. //        SET_BIT(IODIR1,22);
  30. //        SET_BIT(IOSET1,22);          //ON/OFF_GPRS
  31. //        SET_BIT(IODIR1,16);
  32. //        SET_BIT(IOCLR1,16); //GPRSVCC_EN
  33.        
  34. //        Gprs_Delayms(5000);
  35.        
  36.         SET_BIT(IOSET1,16);//LPC_GPIO2->SET |= 1UL << 28;
  37.        
  38.         Gprs_Delayms(1000);
  39.        
  40.         SET_BIT(IOCLR1,22);//LPC_GPIO2->SET |= 1UL << 27;
  41.        
  42.         Gprs_Delayms(1000);

  43. }


  44. /*****************************************************
  45.         *函數名稱:Gprs_Delayms(unsigned timelen)
  46.           *函數描述:ms級的延遲函數
  47.         *入口參數:需要延遲的時間
  48.         *出口參數:無
  49. *****************************************************/
  50. void Gprs_Delayms(unsigned int timelen)
  51. {  
  52.     unsigned int i,count;
  53.         for(i=0;i<timelen;i++)
  54.         {        count=11460;
  55.                 while(count--);                                        //10000大約1ms
  56.                
  57.         }
  58. }



  59. /***************************************************************************************
  60.           *函數名稱:Gprs_CheckPBReady(void)
  61.           *函數描述:檢查是否收到+PBReady,只有接收到“+PBREADY”后,才開始對模塊進行AT指令操作。
  62.         *入口參數:無
  63.         *出口參數:返回一個bool值
  64. ****************************************************************************************/
  65. bool Gprs_CheckPBReady(void)
  66. {
  67.         int timeout=0;
  68.         do
  69.         {
  70.                 timeout++;
  71.                 if(gReceiveFlag == 1)
  72.         {
  73.                     if(strstr((char *)gReceiveBuffer,"+PBREADY")>0)
  74.                     {
  75.                         //說明收到+PBREADY,退出
  76.                             gReceiveFlag = 0;
  77.                                 gReceiveBufferLen = 0;
  78.                                 memset(gReceiveBuffer,0,GPRSBUFFERLEN);
  79.                                 break;
  80.                     }
  81.                     Gprs_Delayms(200);
  82.         }

  83.         }while(timeout<10);
  84.         if(timeout>=10)
  85.         {
  86.                 //報錯
  87.                 return false;
  88.         }
  89.         return true;
  90. }

  91. /*****************************************************
  92.           *函數名稱:Gprs_CheckCCID(void)          
  93.           *函數描述:檢查SIM卡標識信息
  94.         *AT指令:“AT+CCID\r"
  95.         *入口參數:無
  96.         *出口參數:返回一個bool值
  97. *****************************************************/
  98. bool Gprs_CheckCCID(void)
  99. {
  100.         int timeout=0; //超時次數變量
  101.         do
  102.         {
  103.                 timeout++;
  104.             Gprs_SendATCommand("AT+CCID\r",8);  
  105.                 //通過串口發送AT+CCID回車,獲取SIM卡標識
  106.                 Gprs_Delayms(200);                         //延時200ms
  107.         if(gReceiveFlag == 1)
  108.         {
  109.                         //判斷接受緩沖區是否有數據       
  110.                     if(strstr((char *)gReceiveBuffer,"ERROR")==0)       
  111.                     {
  112.                         //查找完全匹配的子字符串,說明返回值不是ERROR,表示讀取sim卡的CCID成功,退出  
  113.                             gReceiveFlag = 0;
  114.                                 gReceiveBufferLen = 0;
  115.                                 memset(gReceiveBuffer,0,GPRSBUFFERLEN);
  116.                                 break;
  117.                     }
  118.         }       
  119.         }while(timeout<10);         
  120.         if(timeout>10)
  121.         {
  122.                 //報錯
  123.                 return false;
  124.         }
  125.          return true;
  126. }





  127. /***************************************************************************************
  128.           *函數名稱:Gprs_CheckAT(void)
  129.           *函數描述:檢查串口是否通,收到OK,則說明串口已接通
  130.         *AT指令:“AT\r"
  131.         *入口參數:無
  132.         *出口參數:返回一個bool值
  133. ****************************************************************************************/
  134. bool Gprs_CheckAT(void)
  135. {
  136.         int timeout=0;
  137. //        char str[35];
  138.         do
  139.         {
  140.                 timeout++;
  141.                 Gprs_SendATCommand("AT\r",3);         //通過串口發送AT回車
  142.                 Gprs_Delayms(100);
  143.                  if(gReceiveFlag == 1)
  144.          {
  145.                           //UART0_snd((unsigned char *)gReceiveBuffer,gReceiveBufferLen);
  146.                      if(strstr((char *)gReceiveBuffer,"OK")>0)
  147.                      {
  148.                      //說明串口通,退出
  149.                              gReceiveFlag = 0;
  150.                                  gReceiveBufferLen = 0;
  151.                                  memset(gReceiveBuffer,0,GPRSBUFFERLEN);
  152.                                  break;
  153.                     }
  154.          }
  155.         }while(timeout<10);
  156.          if(timeout>=10)
  157.         {
  158.         //報錯

  159. //        test+=100;
  160. //        sprintf(str,"%d",test);
  161. //        UART0_snd(str,sizeof(str));
  162. // UART1_init(60000000, test);
  163.          return false;
  164.         }
  165.         return true;
  166. }


  167. /***************************************************************************************
  168.           *函數名稱:Gprs_CheckCSQ(void)
  169.           *函數描述:檢查信號強度,回顯值:+CSQ:<rssi>,<ber>,其中rssi為查詢接受信號
  170.                                 強度,值在0~31之間,值越大表示強度越強,若為99,則說明未知或不可檢測;ber為信道
  171.                                 位錯誤率,值在0~7,若為99,則說明未知或不可檢測
  172.         *AT指令:“AT+CSQ\r"
  173.         *入口參數:無
  174.         *出口參數:返回一個bool值
  175. ****************************************************************************************/
  176. bool Gprs_CheckCSQ(void)
  177. {
  178.         char *buf;
  179.        
  180.         int timeout=0;
  181.         do
  182.         {
  183.                 timeout++;
  184.                 Gprs_SendATCommand("AT+CSQ\r",7);        //檢查信號強度
  185.                 Gprs_Delayms(100);
  186.                 if(gReceiveFlag == 1)
  187.         {
  188.                     if(strstr(gReceiveBuffer,"+CSQ: 99,99")==0)
  189.                     {
  190.                                 //說明檢查的不是99,99,有信號,退出
  191.                                 buf =strstr(gReceiveBuffer,"+CSQ:");
  192.                                 if(sysconfig.Tishi ==0) UART0_snd("Signal: ",8);
  193.                                 if(sysconfig.Tishi ==0) UART0_snd((unsigned char*)&buf[6],2);
  194.                                 if(sysconfig.Tishi ==0) UART0_snd("\r\n",2);
  195.                             gReceiveFlag = 0;
  196.                                 gReceiveBufferLen = 0;
  197.                                 memset(gReceiveBuffer,0,GPRSBUFFERLEN);
  198.                                 break;
  199.                         }
  200.         }
  201.         }while(timeout<10);
  202.          if(timeout>=10)
  203.          {
  204.                  return false;
  205.          }
  206.          return true;
  207. }


  208. /***************************************************************************************
  209.           *函數名稱:Gprs_CheckCREG(void)
  210.           *函數描述:檢查模塊當前的網絡注冊狀態,只有當回顯值為0,1或0,5時,才表示網絡注冊成功
  211.         *AT指令:"AT+CREG?\r"
  212.         *入口參數:無
  213.         *出口參數:返回一個bool值
  214. ****************************************************************************************/
  215. bool Gprs_CheckCREG(void)
  216. {
  217.     int timeout;  // 超時次數變量;           
  218.         timeout = 0;
  219.         do
  220.     {   
  221.             timeout++;
  222.                 Gprs_SendATCommand("AT+CREG?\r",9);
  223.                 // 通過串口發送AT+CREG?回車,查詢模塊的當前網絡注冊狀態       
  224.                 Gprs_Delayms(100);                         
  225.                 if(gReceiveFlag == 1)
  226.         {       
  227.                      
  228.                         if(strstr((char *)gReceiveBuffer,"+CREG: 0,1")>0 ||strstr((char *)gReceiveBuffer,"+CREG: 0,5")>0)//||strstr((char *)gReceiveBuffer,"OK")>0)
  229.                     {
  230.                                 // 如果返回值為+CREG: 0,1或+CREG: 0,5,則網絡注冊成功
  231.                 gReceiveFlag =0;
  232.                                 gReceiveBufferLen = 0;
  233.                                 memset(gReceiveBuffer,0,GPRSBUFFERLEN);
  234.                                 break;
  235.                         }
  236.         }
  237.         }while(timeout<10);         
  238.         if( timeout>=10 )
  239.         {
  240.                 // 報錯;說明網絡注冊失敗!
  241.                 return false;
  242.         }       
  243.         return true;
  244. }

  245. /***************************************************************************************
  246.           *函數名稱:Gprs_SetStack(void)
  247.           *函數描述:設置
  248.         *AT指令:"AT+CREG?\r"
  249.         *入口參數:無
  250.         *出口參數:返回一個bool值
  251. ****************************************************************************************/
  252. bool Gprs_SetStack(void)
  253. {
  254.     int timeout;  // 超時次數變量;           
  255.         timeout = 0;
  256.         do
  257.     {   
  258.             timeout++;
  259.                 Gprs_SendATCommand("AT+_XISP=0\r",10); //使用內部協議棧
  260.                 // 通過串口發送AT+CREG?回車,查詢模塊的當前網絡注冊狀態       
  261.                 Gprs_Delayms(100);                               
  262.                 if(gReceiveFlag == 1)
  263.         {               
  264.                     if( strstr((char *)gReceiveBuffer,"OK")>0 )
  265.                     {
  266.                                 // 如果返回值為+CREG: 0,1或+CREG: 0,5,則網絡注冊成功
  267.                 gReceiveFlag =0;
  268.                                 gReceiveBufferLen = 0;
  269.                                 memset(gReceiveBuffer,0,GPRSBUFFERLEN);
  270.                                 break;
  271.                         }
  272.         }
  273.         }while(timeout<10);         
  274.         if( timeout>=10 )
  275.         {
  276.                 // 報錯;說明網絡注冊失敗!
  277.                 return false;
  278.         }       
  279.         return true;
  280. }
  281. /***************************************************************************************
  282.           *函數名稱:Gprs_CheckPPPLink(void)
  283.           *函數描述:建立PPP鏈接,
  284.         *AT指令:”AT+XIIC=1\r“
  285.         *入口參數:無
  286.         *出口參數:返回一個bool值
  287.         *注:1.在建立PPP鏈路之前,先要使用AT+CGDCONT設定APN等參數
  288.                  2.設置AT+CGDCONT之前要先設置AT+XISP=0,即選擇內部協議棧
  289.                  3.在使用AT+XIIC=1建立PPP連接之前,先要確保模塊已經注冊上網絡。可使用
  290.                    AT+CREG?來判斷,如果返回+CREG:0,1或+CREG:0,5,都表明已注冊上網絡。
  291. ****************************************************************************************/
  292. bool Gprs_CreatePPPLink(void)
  293. {
  294.                 int timeout;  // 超時次數變量;       
  295.                 timeout = 0;
  296.                 do
  297.                 {  
  298.                         timeout++;
  299.                         Gprs_SendATCommand("AT+XIIC=1\r",10);        //要求建立PPP連接
  300.                     Gprs_Delayms(100);                  // 延時100ms       
  301.                         if(gReceiveFlag == 1)
  302.             {                       
  303.                             if( strstr((char *)gReceiveBuffer,"OK")>0 )
  304.                             {
  305.                                         // 如返回OK 跳出循環
  306.                                     gReceiveFlag = 0;
  307.                                         gReceiveBufferLen = 0;
  308.                                         memset(gReceiveBuffer,0,GPRSBUFFERLEN);
  309.                                         break;
  310.                             }
  311.             }
  312.                 }while(timeout<10);                 
  313.             if( timeout>=10 )
  314.                 {
  315.                         // 報錯;說明PPP建立失敗!
  316.                         return false;
  317.                 }
  318.                 return true;
  319.         }


  320. /***************************************************************************************
  321.           *函數名稱:Gprs_CheckPPPStatus(void)
  322.           *函數描述:查詢PPP鏈路狀態
  323.         *AT指令:"AT+XIIC=?\r"
  324.         *入口參數:無
  325.         *出口參數:返回一個bool值
  326. ****************************************************************************************/
  327. bool Gprs_CheckPPPStatus(void)
  328. {
  329.     int value=0;  // 超時次數變量;  
  330.         char *pstr1,*pstr2;         
  331.         do
  332.         {   
  333.                 value++;               
  334.             Gprs_SendATCommand("AT+XIIC?\r",9);
  335.                 //發送AT+XIIC=?查詢鏈路狀態
  336.             Gprs_Delayms(500);   // 延時500ms;               
  337.                 if(gReceiveFlag == 1)
  338.         {                                               
  339.                        if( strstr((char *)gReceiveBuffer,"+XIIC:    1")>0 )
  340. //                                if(strstr((char *)gReceiveBuffer,"OK")>0)
  341.                     {
  342.                         //判斷返回值 如果返回+XIIC:    1, *.*.*.*,則跳出循環,1前面有4個空格                               
  343.                             //result_ok = true;
  344.                                 pstr1=strstr((char *)gReceiveBuffer,"1,");
  345.                                 pstr2=strstr((char *)pstr1,"\r\n");
  346.                                 if((pstr2>pstr1)&&pstr1!=0) MyIPStrl=(pstr2-pstr1)-3;
  347.                                 else return false;
  348.                                 memcpy(MyIPStr,pstr1+3,MyIPStrl);
  349.                                 gReceiveFlag = 0;
  350.                                 gReceiveBufferLen = 0;
  351.                                 memset(gReceiveBuffer,0,GPRSBUFFERLEN);
  352.                                 if(sysconfig.Tishi ==0) UART0_snd("PPP Link OK\r\n",13);
  353.                                 if(sysconfig.Tishi ==0) UART0_snd("IP: ",4);
  354.                                 if(sysconfig.Tishi ==0) UART0_snd((unsigned char*)MyIPStr,MyIPStrl);
  355.                                 if(sysconfig.Tishi ==0) UART0_snd("\r\n",2);
  356.                                 break;
  357.                     }
  358.                     gReceiveFlag = 0;
  359.                                 gReceiveBufferLen = 0;
  360.                                 memset(gReceiveBuffer,0,GPRSBUFFERLEN);
  361.         }
  362.         }while(value<5);          
  363.         if( value>=5 )
  364.         {
  365.                 // 報錯;說明PPP建立失敗!
  366.                 return false;
  367.         }
  368.         return true;
  369. }
  370. bool Search_IP(void)
  371. {
  372.         char buffer[50];
  373.         unsigned char i,len;
  374.         char *pstr1,*pstr2;
  375.         int value=0;  // 超時次數變量;
  376.         sprintf(buffer,"AT+DNS=");
  377.         buffer[7]=0x22;
  378.         for(i=8;i<sysconfig.gprs_station.lDomainName+8;i++) buffer[i]=sysconfig.gprs_station.DomainName[i-8];
  379.         buffer[i]=0x22;
  380.         len=i+1;
  381.         buffer[len]='\r';
  382.         len++;
  383.         Gprs_SendATCommand(buffer,len);//發送查詢鏈路狀態
  384.         do
  385.         {   
  386.                 value++;               
  387.            
  388.                
  389.             Gprs_Delayms(1000);   // 延時500ms;               
  390.                 if(gReceiveFlag == 1)
  391.         {   pstr2=strstr((char *)gReceiveBuffer,"+DNS:OK");
  392.                         pstr1=strstr((char *)gReceiveBuffer,"+DNS:");                                          
  393.                        if( (pstr2!=NULL)&&(pstr1!=NULL)&&(pstr2>pstr1) )
  394. //                                if(strstr((char *)gReceiveBuffer,"OK")>0)
  395.                     {
  396.                         //判斷返回值 如果返回+XIIC:    1, *.*.*.*,則跳出循環,1前面有4個空格                               

  397.                                 DomainStrl=pstr2-pstr1;
  398.                                 DomainStrl-=7;
  399.                                 memcpy(DomainStr,pstr1+5,DomainStrl);
  400.                                 sprintf(&DomainStr[DomainStrl],",%d\r",sysconfig.gprs_station.Cport);
  401.                                 DomainStrl+=3;
  402.                                 gReceiveFlag = 0;
  403.                                 gReceiveBufferLen = 0;
  404.                                 memset(gReceiveBuffer,0,GPRSBUFFERLEN);
  405.                                 break;
  406.                     }
  407.             //        gReceiveFlag = 0;
  408.                         //        gReceiveBufferLen = 0;
  409.                         //        memset(gReceiveBuffer,0,GPRSBUFFERLEN);
  410.         }
  411.         }while(value<5);          
  412.         if( value>=5 )
  413.         {        if(sysconfig.Tishi ==0)  UART0_snd("Get IP By Domain Name False.\r\n",30);
  414.                 Reset();// 報錯;說明PPP建立失敗!
  415.                 return false;
  416.         }
  417.         return true;
  418. }
  419. /********************************************************************************
  420.    *函數名稱:Gprs_CreateTCPLink(unsigned char *linkStr,int size)
  421.    *函數功能:建立TCP鏈接
  422.    *AT指令:AT+TCPSETUP=<n>,<ip>,<port>
  423.                            其中n為鏈路編號0和1;ip為目的IP地址,必須是形如XX.XX.XX.XX的輸入;
  424.                         port為目的端口號,必須是十進制的ASCII碼
  425.    *入口參數:所需發送的TCP指令 AT+TCPSETUP=<n>,<ip>,<port>,即包括所有信息的字符串
  426.    *出口參數:返回一個bool值
  427. **********************************************************************************/
  428. bool Gprs_CreateTCPLink(char *linkStr,int size)
  429. {
  430.     int timeout;  // 超時次數變量;
  431.         if( size<=0 )        
  432.         return false;
  433.         timeout = 0;
  434.         Gprs_SendATCommand(linkStr,size);//發送AT指令建立TCP連接               
  435.         Gprs_Delayms(500);   // 延時500ms;
  436.         do
  437.         {
  438.                 timeout++;
  439.                 Gprs_Delayms(100);   // 延時10ms;
  440.                 if(gReceiveFlag == 1)
  441.         {
  442.                     if( strstr((char *)gReceiveBuffer,"+TCPSETUP:0,OK")>0 )
  443.                     {
  444.                                 //判斷返回值 如果返回+TCPSETUP:0,OK,則跳出循環                   
  445.                             gReceiveFlag = 0;
  446.                                 gReceiveBufferLen = 0;
  447.                                 memset(gReceiveBuffer,0,GPRSBUFFERLEN);
  448.                                 break;
  449.                     }
  450.         }
  451.         }while(timeout<10);       
  452.         if( timeout>=10 )
  453.         {
  454.                 // 報錯;說明TCP鏈接失敗!
  455.                 return false;
  456.         }       
  457.         return true;
  458. }
  459. bool Gprs_CreateUDPLink(char *linkStr,int size)
  460. {
  461.     int timeout;  // 超時次數變量;
  462.         if( size<=0 )        
  463.         return false;
  464.         timeout = 0;
  465.         Gprs_SendATCommand(linkStr,size);//發送AT指令建立TCP連接               
  466.         Gprs_Delayms(500);   // 延時500ms;
  467.         do
  468.         {
  469.                 timeout++;
  470.                 Gprs_Delayms(100);   // 延時10ms;
  471.                 if(gReceiveFlag == 1)
  472.         {
  473.                     if( strstr((char *)gReceiveBuffer,"+UDPSETUP:1,OK")>0 )
  474.                     {
  475.                                 //判斷返回值 如果返回+UDPSETUP:1,OK,則跳出循環                   
  476.                             gReceiveFlag = 0;
  477.                                 gReceiveBufferLen = 0;
  478.                                 memset(gReceiveBuffer,0,GPRSBUFFERLEN);
  479.                                 break;
  480.                     }
  481.         }
  482.         }while(timeout<10);       
  483.         if( timeout>=10 )
  484.         {
  485.                 // 報錯;說明UDP鏈接失敗!
  486.                 return false;
  487.         }       
  488.         return true;
  489. }

  490. /***************************************************************************************
  491.           *函數名稱:Gprs_CloseTCPLink(void)
  492.           *函數描述:關閉TCP鏈路
  493.         *AT指令:AT+TCPCLOSE=<n> 其中的n為鏈路號
  494.         *入口參數:無
  495.         *出口參數:返回一個bool值
  496. ****************************************************************************************/
  497. bool Gprs_CloseTCPLink(void)
  498. {
  499.         Gprs_SendATCommand("AT+TCPCLOSE=0\r",14);// 發送AT+TCPCLOSE=0回車
  500.     Gprs_Delayms(300);
  501.         return true;
  502. }
  503. bool Gprs_CloseUDPLink(void)
  504. {
  505.         Gprs_SendATCommand("AT+UDPCLOSE=0\r",14);// 發送AT+UDPCLOSE=0回車
  506.     Gprs_Delayms(300);
  507.         return true;
  508. }

  509. /***************************************************************************************
  510.           *函數名稱:Gprs_TCP_SendData(void)
  511.           *函數描述:發送TCP數據,這條命令發送完畢后,會接收到大于號">",這時候請延遲50ms~100ms,
  512.                                 然后發送數據
  513.         *AT指令:AT+TCPSEND=<n>,<length> 其中n為鏈路編號 length為要發送的數據長度,以字節為單位
  514.                  取值范圍1~200
  515.         *入口參數:無
  516.         *出口參數:返回一個bool值
  517. ****************************************************************************************/
  518. bool         Gprs_TCP_SendData(unsigned char *databuf,int size)
  519. {
  520.         int timeout=0;
  521.     char sendtemp[20];

  522.         // 發送數據之前先使用AT+IPSTATUS查看可用 buffer的大小
  523.         do
  524.         {
  525.                 timeout++;
  526.                 Gprs_SendATCommand("AT+IPSTATUS=0\r",14);//發送AT+IPSTATUS=0回車查詢TCP鏈路狀態
  527.                 Gprs_Delayms(300);       
  528.                 if(gReceiveFlag == 1)
  529.         {
  530.                     if( strstr((char *)gReceiveBuffer,"+IPSTATUS:0,CONNECT,TCP")>0 )
  531.                     {
  532.                         //鏈路0建立連接
  533.                 gReceiveFlag =0;
  534.                                 gReceiveBufferLen = 0;
  535.                                 memset(gReceiveBuffer,0,GPRSBUFFERLEN);
  536.                             break;
  537.                     }
  538.                     if( strstr((char *)gReceiveBuffer,"+IPSTATUS:0,DISCONNECT")>0 )
  539.                     {
  540.                             // 報錯;說明鏈路沒有建立;
  541.                                 #ifdef DEBUG
  542.                                 UART0_snd("+IPSTATUS:0,DISCONNECT,TCP\r\n",28);
  543.                                 #endif
  544.                                 Reset();
  545.                     }
  546.             gReceiveFlag =0;
  547.                         gReceiveBufferLen = 0;
  548.                         memset(gReceiveBuffer,0,GPRSBUFFERLEN);
  549.         }
  550.         }while(timeout<10);                
  551.         if( timeout>=10 )
  552.         {
  553.                 // 報錯;說明TCP鏈接失敗!
  554.                 return false;
  555.         }

  556.         // 如果TCP狀態OK 則開始發送TCP指令;
  557.         if(size<10)
  558.         {
  559.                 sprintf(sendtemp,"AT+TCPSEND=0,%1d\r",size);
  560.                 Gprs_SendATCommand(sendtemp,15);        //發送 AT+TCPSEND=0,size回車,發送size個字節;
  561.         }
  562.     if((size<100)&&(size>10))
  563.     {
  564.         sprintf(sendtemp,"AT+TCPSEND=0,%2d\r",size);
  565.                 Gprs_SendATCommand(sendtemp,16);        //發送 AT+TCPSEND=0,size回車,發送size個字節;
  566.     }
  567.     else if((size>=100)&&(size<1000))
  568.     {
  569.         sprintf(sendtemp,"AT+TCPSEND=0,%3d\r",size);
  570.                 Gprs_SendATCommand(sendtemp,17);        //發送 AT+TCPSEND=0,size回車,發送size個字節;            
  571.     }
  572.         else if(size>=1000)
  573.         {
  574.            sprintf(sendtemp,"AT+TCPSEND=0,%4d\r",size);
  575.                 Gprs_SendATCommand(sendtemp,18);
  576.         }
  577.         // 判斷接收發送符:">"
  578.         do
  579.         {
  580.                 timeout++;
  581.                 Gprs_Delayms(150);   // 延時100ms;
  582.                 if(gReceiveFlag == 1)
  583.         {
  584.                         if( strstr((char *)gReceiveBuffer,">")>0 )
  585.                         {
  586.                                    //判斷返回值 如果返回>,則跳出循環,表示可以發送數據了;
  587.                                 gReceiveFlag = 0;
  588.                                 gReceiveBufferLen = 0;
  589.                                 memset(gReceiveBuffer,0,GPRSBUFFERLEN);
  590.                                 break;
  591.                         }
  592.         }
  593.         }while(timeout<10);       
  594.         if( timeout>=10 )
  595.         {
  596.                 // 報錯;說明沒有收到 >,不能發送數據!
  597.                 return false;
  598.         }
  599.         memcpy(gSendBuffer,databuf,size);
  600.         // 開始發送數據;發送數據時,必須在數據包的末尾加上0x0d 作為結束符,但該結束符不算到數據長度里,
  601.     gSendBuffer[size+1] = 0x0D;
  602.         UART1_snd(gSendBuffer,size+1); //發送size個字節數據和回車;記住數據最后要加回車符;
  603.         Gprs_Delayms(200);   // 延時100ms;
  604.         if(gReceiveFlag == 1)
  605.     {
  606.                 if( strstr((char *)gReceiveBuffer,"+TCPSEND:0,")>0 )
  607.                 {
  608.                         // 判斷返回值 如果返回+TCPSEND:0,50;表示發送成功;
  609.             gReceiveFlag =0;
  610.                         gReceiveBufferLen = 0;
  611.                         memset(gReceiveBuffer,0,GPRSBUFFERLEN);
  612.                         return true;
  613.                 }
  614.                 else if( strstr((char *)gReceiveBuffer,"+TCPSEND:Error")>0 )
  615.                 {
  616.                 // 判斷返回值 如果返回+TCPSEND:Error;在鏈路0 上發送50字節的數據,該鏈路尚未建立,發送失敗。
  617.                         gReceiveFlag =0;
  618.                         gReceiveBufferLen = 0;
  619.                         memset(gReceiveBuffer,0,GPRSBUFFERLEN);
  620.             return false;
  621.                 }
  622.                 else if( strstr((char *)gReceiveBuffer,"+TCPSEND:Buffer not enough")>0 )
  623.                 {
  624.                         // 判斷返回值 如果返回+TCPSEND:Buffer not enough;在鏈路0 上發送50字節的數據,內部buffer不足,發送失敗。
  625.             gReceiveFlag =0;
  626.                         gReceiveBufferLen = 0;
  627.                         memset(gReceiveBuffer,0,GPRSBUFFERLEN);
  628.                         return false;
  629.                 }
  630.     }
  631.         return true;
  632.         // 根據情況加上相應的代碼進行處理  ....
  633. }
  634. bool         Gprs_UDP_SendData(unsigned char *databuf,int size)
  635. {
  636.         int timeout=0;
  637.     char sendtemp[20];

  638.         // 發送數據之前先使用AT+IPSTATUS查看可用 buffer的大小
  639.         do
  640.         {
  641.                 timeout++;
  642.                 Gprs_SendATCommand("AT+IPSTATUS=1\r",14);//發送AT+IPSTATUS=0回車查詢TCP鏈路狀態
  643.                 Gprs_Delayms(300);       
  644.                 if(gReceiveFlag == 1)
  645.         {
  646.                     if( strstr((char *)gReceiveBuffer,"+IPSTATUS:1,CONNECT,UDP")>0 )
  647.                     {
  648.                         //鏈路0建立連接
  649.                 gReceiveFlag =0;
  650.                                 gReceiveBufferLen = 0;
  651.                                 memset(gReceiveBuffer,0,GPRSBUFFERLEN);
  652.                             break;
  653.                     }
  654.                     if( strstr((char *)gReceiveBuffer,"+IPSTATUS:1,DISCONNECT")>0 )
  655.                     {
  656.                             // 報錯;說明鏈路沒有建立;
  657.                                 #ifdef DEBUG
  658.                                 UART0_snd("+IPSTATUS:1,DISCONNECT,UDP\r\n",28);
  659.                                 #endif
  660.                                 Reset();
  661.                     }
  662.             gReceiveFlag =0;
  663.                         gReceiveBufferLen = 0;
  664.                         memset(gReceiveBuffer,0,GPRSBUFFERLEN);
  665.         }
  666.         }while(timeout<10);                
  667.         if( timeout>=10 )
  668.         {
  669.                 // 報錯;說明TCP鏈接失敗!
  670.                 return false;
  671.         }

  672.         // 如果TCP狀態OK 則開始發送TCP指令;
  673.         if(size<10)
  674.         {
  675.                 sprintf(sendtemp,"AT+UDPSEND=1,%1d\r",size);
  676.                 Gprs_SendATCommand(sendtemp,15);        //發送 AT+TCPSEND=0,size回車,發送size個字節;
  677.         }
  678.     if((size<100)&&(size>10))
  679.     {
  680.         sprintf(sendtemp,"AT+UDPSEND=1,%2d\r",size);
  681.                 Gprs_SendATCommand(sendtemp,16);        //發送 AT+TCPSEND=0,size回車,發送size個字節;
  682.     }
  683.     else if((size>=100)&&(size<1000))
  684.     {
  685.         sprintf(sendtemp,"AT+UDPSEND=1,%3d\r",size);
  686.                 Gprs_SendATCommand(sendtemp,17);        //發送 AT+TCPSEND=0,size回車,發送size個字節;            
  687.     }
  688.         else if(size>=1000)
  689.         {
  690.            sprintf(sendtemp,"AT+UDPSEND=1,%4d\r",size);
  691.                 Gprs_SendATCommand(sendtemp,18);
  692.         }
  693.         // 判斷接收發送符:">"
  694.         do
  695.         {
  696.                 timeout++;
  697.                 Gprs_Delayms(150);   // 延時100ms;
  698.                 if(gReceiveFlag == 1)
  699.         {
  700.                         if( strstr((char *)gReceiveBuffer,">")>0 )
  701.                         {
  702.                                    //判斷返回值 如果返回>,則跳出循環,表示可以發送數據了;
  703.                                 gReceiveFlag = 0;
  704.                                 gReceiveBufferLen = 0;
  705.                                 memset(gReceiveBuffer,0,GPRSBUFFERLEN);
  706.                                 break;
  707.                         }
  708.         }
  709.         }while(timeout<10);       
  710.         if( timeout>=10 )
  711.         {
  712.                 // 報錯;說明沒有收到 >,不能發送數據!
  713.                 return false;
  714.         }
  715.         memcpy(gSendBuffer,databuf,size);
  716.         // 開始發送數據;發送數據時,必須在數據包的末尾加上0x0d 作為結束符,但該結束符不算到數據長度里,
  717.     gSendBuffer[size+1] = 0x0D;
  718.         UART1_snd(gSendBuffer,size+1); //發送size個字節數據和回車;記住數據最后要加回車符;
  719.         Gprs_Delayms(200);   // 延時100ms;
  720.         if(gReceiveFlag == 1)
  721.     {
  722.                 if( strstr((char *)gReceiveBuffer,"+UDPSEND:0,")>0 )
  723.                 {
  724.                         // 判斷返回值 如果返回+TCPSEND:0,50;表示發送成功;
  725.             gReceiveFlag =0;
  726.                         gReceiveBufferLen = 0;
  727.                         memset(gReceiveBuffer,0,GPRSBUFFERLEN);
  728.                         return true;
  729.                 }
  730.                 else if( strstr((char *)gReceiveBuffer,"+UDPSEND:Error")>0 )
  731.                 {
  732.                 // 判斷返回值 如果返回+TCPSEND:Error;在鏈路0 上發送50字節的數據,該鏈路尚未建立,發送失敗。
  733.                         gReceiveFlag =0;
  734.                         gReceiveBufferLen = 0;
  735.                         memset(gReceiveBuffer,0,GPRSBUFFERLEN);
  736.             return false;
  737.                 }
  738.                 else if( strstr((char *)gReceiveBuffer,"+UDPSEND:Buffer not enough")>0 )
  739.                 {
  740.                         // 判斷返回值 如果返回+TCPSEND:Buffer not enough;在鏈路0 上發送50字節的數據,內部buffer不足,發送失敗。
  741.             gReceiveFlag =0;
  742.                         gReceiveBufferLen = 0;
  743.                         memset(gReceiveBuffer,0,GPRSBUFFERLEN);
  744.                         return false;
  745.                 }
  746.     }
  747.         return true;
  748.         // 根據情況加上相應的代碼進行處理  ....
  749. }

  750. /***************************************************************************************
  751.           *函數名稱:Gprs_TCP_ReceiveData(void)
  752.           *函數描述:接收TCP數據
  753.         *入口參數:無
  754.         *出口參數:返回一個bool值
  755. ****************************************************************************************/
  756. bool Gprs_TCP_ReceiveData(void)
  757. {
  758.     unsigned long recvlen;
  759.     unsigned char i;
  760.    
  761.     Gprs_Delayms(500);
  762.         if(gReceiveFlag == 1)
  763.     {
  764.                 if( strstr((char *)gReceiveBuffer,"+TCPRECV:0")>0 )
  765.                 {// 如果返回+TCPRECV:0
  766.                         // 解析后面的長度和數據;在這里加上代碼;
  767.             if(gReceiveBuffer[12] == 0x2C)
  768.             {               
  769.                 for(i=0;i<4;i++)
  770.                 {
  771.                     if(gReceiveBuffer[13+i] == 0x2C) break;   
  772.                 }
  773.                 if(i==4)
  774.                 {
  775.                     goto rcverr;   
  776.                 }
  777.                                 if(i==1)
  778.                 {
  779.                     recvlen = (gReceiveBuffer[13]-0x30);
  780.                     if(recvlen > GPRSBUFFERLEN)
  781.                     {
  782.                         goto rcverr;
  783.                     }
  784.                                 AppDataGprsRcv((unsigned char *)&gReceiveBuffer[15], recvlen);   
  785.                 }
  786.                 if(i==2)
  787.                 {
  788.                     recvlen = (gReceiveBuffer[13]-0x30)*10+(gReceiveBuffer[14]-0x30);
  789.                     if(recvlen > GPRSBUFFERLEN)
  790.                     {
  791.                         goto rcverr;
  792.                     }
  793.                                 AppDataGprsRcv((unsigned char *)gReceiveBuffer+16, recvlen);   
  794.                 }
  795.                 if(i==3)
  796.                 {
  797.                     recvlen = (gReceiveBuffer[13]-0x30)*100+(gReceiveBuffer[14]-0x30)*10+(gReceiveBuffer[15]-0x30);
  798.                     if(recvlen > GPRSBUFFERLEN)
  799.                     {
  800.                         goto rcverr;
  801.                     }
  802.                                 AppDataGprsRcv((unsigned char *)gReceiveBuffer+17, recvlen);   
  803.                 }
  804.             }
  805.             else
  806.             {
  807. rcverr:         gReceiveFlag = 0;
  808.                             gReceiveBufferLen = 0;
  809.                             memset(gReceiveBuffer,0,GPRSBUFFERLEN);
  810.                 return false;   
  811.             }
  812.             gReceiveFlag = 0;
  813.                         gReceiveBufferLen = 0;
  814.                         memset(gReceiveBuffer,0,GPRSBUFFERLEN);         
  815.                         return true;
  816.                 }
  817.     }
  818.         gReceiveFlag = 0;
  819.     gReceiveBufferLen = 0;
  820.     memset(gReceiveBuffer,0,GPRSBUFFERLEN);
  821.         return false;
  822. }
  823. bool Gprs_UDP_ReceiveData(void)
  824. {
  825.     unsigned long recvlen;
  826.     unsigned char i;
  827.    
  828.     Gprs_Delayms(500);
  829.         if(gReceiveFlag == 1)
  830.     {
  831.                 if( strstr((char *)gReceiveBuffer,"+UDPRECV:1")>0 )
  832.                 {// 如果返回+TCPRECV:0
  833.                         // 解析后面的長度和數據;在這里加上代碼;
  834.             if(gReceiveBuffer[12] == 0x2C)
  835.             {               
  836.                 for(i=0;i<4;i++)
  837.                 {
  838.                     if(gReceiveBuffer[13+i] == 0x2C) break;   
  839.                 }
  840.                 if(i==4)
  841.                 {
  842.                     goto rcverr;   
  843.                 }
  844.                                 if(i==1)
  845.                 {
  846.                     recvlen = (gReceiveBuffer[13]-0x30);
  847.                     if(recvlen > GPRSBUFFERLEN)
  848.                     {
  849.                         goto rcverr;
  850.                     }
  851.                                 AppDataGprsRcv((unsigned char *)&gReceiveBuffer[15], recvlen);   
  852.                 }
  853.                 if(i==2)
  854.                 {
  855.                     recvlen = (gReceiveBuffer[13]-0x30)*10+(gReceiveBuffer[14]-0x30);
  856.                     if(recvlen > GPRSBUFFERLEN)
  857.                     {
  858.                         goto rcverr;
  859.                     }
  860.                                 AppDataGprsRcv((unsigned char *)gReceiveBuffer+16, recvlen);   
  861.                 }
  862.                 if(i==3)
  863.                 {
  864.                     recvlen = (gReceiveBuffer[13]-0x30)*100+(gReceiveBuffer[14]-0x30)*10+(gReceiveBuffer[15]-0x30);
  865.                     if(recvlen > GPRSBUFFERLEN)
  866.                     {
  867.                         goto rcverr;
  868.                     }
  869.                                 AppDataGprsRcv((unsigned char *)gReceiveBuffer+17, recvlen);   
  870.                 }
  871.             }
  872.             else
  873.             {
  874. rcverr:         gReceiveFlag = 0;
  875.                             gReceiveBufferLen = 0;
  876.                             memset(gReceiveBuffer,0,GPRSBUFFERLEN);
  877.                 return false;   
  878.             }
  879.             gReceiveFlag = 0;
  880.                         gReceiveBufferLen = 0;
  881.                         memset(gReceiveBuffer,0,GPRSBUFFERLEN);         
  882.                         return true;
  883.                 }
  884.     }
  885.         gReceiveFlag = 0;
  886.     gReceiveBufferLen = 0;
  887.     memset(gReceiveBuffer,0,GPRSBUFFERLEN);
  888.         return false;
  889. }
  890. /***************************************************************************************
  891.           *函數名稱:Gprs_SingleTCPLink(unsigned char iLinkNum,char *strServerIP,char *strPort)
  892.           *函數描述:創建單TCP鏈路
  893.         *AT指令:AT+TCPSETUP=<n>,<ip>,<port>
  894.         *入口參數:無
  895.         *出口參數:返回一個bool值
  896. ****************************************************************************************/
  897. bool Gprs_SingleTCPLink(unsigned char iLinkNum,unsigned char *strServerIP,unsigned short strPort)
  898. {
  899.         unsigned int length;
  900.     char buffer[50];       
  901.         memset(buffer,0x00,sizeof(buffer));
  902.         sprintf(buffer,"AT+TCPSETUP=%d,%d.%d.%d.%d,%d\r",iLinkNum,
  903.                                                      strServerIP[0],
  904.                                                      strServerIP[1],
  905.                                                      strServerIP[2],
  906.                                                      strServerIP[3],
  907.                                                      strPort);
  908.         length = strlen((char *)buffer);
  909.         if( !Gprs_CreateTCPLink(buffer,length) )  
  910.         {
  911.                 return false;// 建立TCP連接失敗;
  912.         }
  913.         return true;
  914. }
  915. bool Gprs_SingleUDPLink(unsigned char iLinkNum,unsigned char *strServerIP,unsigned short strPort)
  916. {
  917.         unsigned int length;
  918.     char buffer[50];       
  919.         memset(buffer,0x00,sizeof(buffer));
  920.         sprintf(buffer,"AT+UDPSETUP=%d,%d.%d.%d.%d,%d\r",iLinkNum,
  921.                                                      strServerIP[0],
  922.                                                      strServerIP[1],
  923.                                                      strServerIP[2],
  924.                                                      strServerIP[3],
  925.                                                      strPort);
  926.         length = strlen((char *)buffer);
  927.         if( !Gprs_CreateUDPLink(buffer,length) )  
  928.         {
  929.                 return false;// 建立TCP連接失敗;
  930.         }
  931.         return true;
  932. }
  933. bool Gprs_DomainTCPLink(unsigned char iLinkNum)
  934. {
  935.         unsigned int length;
  936.     char buffer[50];       
  937.         memset(buffer,0x00,sizeof(buffer));
  938.         sprintf(buffer,"AT+TCPSETUP=%d,",iLinkNum);
  939.         length = strlen((char *)buffer);
  940.         sprintf(&buffer[length],DomainStr);
  941.         length = strlen((char *)buffer);
  942.         if( !Gprs_CreateTCPLink(buffer,length) )  
  943.         {
  944.                 return false;// 建立TCP連接失敗;
  945.         }
  946.         return true;
  947. }
  948. bool Gprs_DomainUDPLink(unsigned char iLinkNum)
  949. {
  950.         unsigned int length;
  951.     char buffer[50];       
  952.         memset(buffer,0x00,sizeof(buffer));
  953.         sprintf(buffer,"AT+UDPSETUP=%d,",iLinkNum);
  954.         length = strlen((char *)buffer);
  955.         sprintf(&buffer[length],DomainStr);
  956.         length = strlen((char *)buffer);
  957.         if( !Gprs_CreateUDPLink(buffer,length) )  
  958.         {
  959.                 return false;// 建立TCP連接失敗;
  960.         }
  961.         return true;
  962. }

  963. /***************************************************************************************
  964.           *函數名稱:Gprs_SendATCommand(char *strCmd,unsigned long len)
  965.           *函數描述:發送AT指令函數
  966.         *入口參數:發送字符串,及長度
  967.         *出口參數:返回一個bool值
  968. ****************************************************************************************/
  969. bool Gprs_SendATCommand(char *strCmd,unsigned long len)
  970. {
  971.         if(len<=0)
  972.         return false;
  973.        
  974.            UART1_snd((unsigned char*)strCmd,len);
  975.         return true;
  976. }

  977. ///***************************************************************************************
  978. //          *函數名稱:Gprs_ReceiveFromUart(char *data,unsigned long len)
  979. //          *函數描述:從串口中接收數據
  980. //        *入口參數:接收到的字符串及長度
  981. //        *出口參數:無
  982. // ****************************************************************************************/
  983. //void Gprs_ReceiveFromUart(char *data,unsigned long len)
  984. //{
  985. //        unsigned char i;
  986. //                unsigned long buflen;
  987. //                if(gReceiveFlag==0)
  988. //                {
  989. //                        memset(gReceiveBuffer ,0x00,sizeof(gReceiveBuffer));
  990. //                        memcpy(gReceiveBuffer,data,len);
  991. //                        gReceiveBufferLen = len;
  992. //                        gReceiveFlag= 1;       
  993. //                }
  994. //                else
  995. //                {
  996. ……………………

  997. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼

所有資料51hei提供下載:
7213-Modbus.zip (921.66 KB, 下載次數: 20)


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

使用道具 舉報

沙發
ID:1 發表于 2018-10-7 00:17 | 只看該作者
補全原理圖或者詳細說明一下電路連接即可獲得100+黑幣
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美高清视频一区 | 日本又色又爽又黄的大片 | 国产最新网址 | 欧美视频在线观看 | 91精品国产91久久久久久密臀 | 亚洲欧美日韩激情 | 日韩精品视频中文字幕 | 日韩在线观看一区 | 欧美成人a∨高清免费观看 欧美日韩中 | 欧美日韩a| 色婷婷亚洲国产女人的天堂 | 欧美另类视频 | 91久久国产综合久久 | 国产精品久久久久久吹潮 | 国产高清在线精品一区二区三区 | 久久一区二区三区四区 | 国产精品69久久久久水密桃 | 久久国产精品-国产精品 | av免费网址 | a级在线免费 | 国产视频一区在线 | 欧美一区二区视频 | 国产丝袜一区二区三区免费视频 | 国产精品一区二区福利视频 | 欧美天堂在线观看 | 欧美在线观看网站 | 午夜视频一区二区三区 | 欧美日韩不卡在线 | 日韩视频在线观看中文字幕 | 狠狠爱一区二区三区 | 精品一区在线免费观看 | 欧美1区2区 | 一区二区三区av | 亚洲综合精品 | 99这里只有精品视频 | 欧美一级片| 国产精品欧美日韩 | 日韩精品一区二区三区老鸭窝 | 亚洲三区在线观看 | 天天看天天爽 | 亚洲综合一区二区三区 |