找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3476|回复: 1
收起左侧

完整实际应用NXP modbus编程实例

[复制链接]
ID:90762 发表于 2018-10-6 15:53 | 显示全部楼层 |阅读模式
完整实际应用NXP modbus编程实例。包括modbus协议,flash 编程
0.png

单片机源程序如下:

  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, 下载次数: 19)
回复

使用道具 举报

ID:1 发表于 2018-10-7 00:17 | 显示全部楼层
补全原理图或者详细说明一下电路连接即可获得100+黑币
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表