标题:
完整实际应用NXP modbus编程实例
[打印本页]
作者:
liu100m
时间:
2018-10-6 15:53
标题:
完整实际应用NXP modbus编程实例
完整实际应用NXP modbus编程实例。包括modbus协议,flash 编程
0.png
(10.6 KB, 下载次数: 34)
下载附件
2018-10-7 00:16 上传
单片机源程序如下:
#include "config.h"
// unsigned int test=1200;
CONFIG_TYPE sysconfig; //终端配置信息
unsigned char gSendBuffer[GPRSBUFFERLEN];
char gReceiveBuffer[GPRSBUFFERLEN];
char DomainStr[30];
char DomainStrl;
char MyIPStr[30];
char MyIPStrl;
unsigned long gReceiveBufferLen = 0;
unsigned char gReceiveFlag = 0;
//创建多TCP链路
typedef enum
{ Link0,
Link1,
Link2,
Link3,
}link_enum_type;
void GPRS_OFF(void)
{
SET_BIT(IODIR1,22);
SET_BIT(IOSET1,22); //ON/OFF_GPRS
SET_BIT(IODIR1,16);
SET_BIT(IOCLR1,16); //GPRSVCC_EN
}
void GPRS_Init(void)
{
/******GPRS启动时序******/
// SET_BIT(IODIR1,22);
// SET_BIT(IOSET1,22); //ON/OFF_GPRS
// SET_BIT(IODIR1,16);
// SET_BIT(IOCLR1,16); //GPRSVCC_EN
// Gprs_Delayms(5000);
SET_BIT(IOSET1,16);//LPC_GPIO2->SET |= 1UL << 28;
Gprs_Delayms(1000);
SET_BIT(IOCLR1,22);//LPC_GPIO2->SET |= 1UL << 27;
Gprs_Delayms(1000);
}
/*****************************************************
*函数名称:Gprs_Delayms(unsigned timelen)
*函数描述:ms级的延迟函数
*入口参数:需要延迟的时间
*出口参数:无
*****************************************************/
void Gprs_Delayms(unsigned int timelen)
{
unsigned int i,count;
for(i=0;i<timelen;i++)
{ count=11460;
while(count--); //10000大约1ms
}
}
/***************************************************************************************
*函数名称:Gprs_CheckPBReady(void)
*函数描述:检查是否收到+PBReady,只有接收到“+PBREADY”后,才开始对模块进行AT指令操作。
*入口参数:无
*出口参数:返回一个bool值
****************************************************************************************/
bool Gprs_CheckPBReady(void)
{
int timeout=0;
do
{
timeout++;
if(gReceiveFlag == 1)
{
if(strstr((char *)gReceiveBuffer,"+PBREADY")>0)
{
//说明收到+PBREADY,退出
gReceiveFlag = 0;
gReceiveBufferLen = 0;
memset(gReceiveBuffer,0,GPRSBUFFERLEN);
break;
}
Gprs_Delayms(200);
}
}while(timeout<10);
if(timeout>=10)
{
//报错
return false;
}
return true;
}
/*****************************************************
*函数名称:Gprs_CheckCCID(void)
*函数描述:检查SIM卡标识信息
*AT指令:“AT+CCID\r"
*入口参数:无
*出口参数:返回一个bool值
*****************************************************/
bool Gprs_CheckCCID(void)
{
int timeout=0; //超时次数变量
do
{
timeout++;
Gprs_SendATCommand("AT+CCID\r",8);
//通过串口发送AT+CCID回车,获取SIM卡标识
Gprs_Delayms(200); //延时200ms
if(gReceiveFlag == 1)
{
//判断接受缓冲区是否有数据
if(strstr((char *)gReceiveBuffer,"ERROR")==0)
{
//查找完全匹配的子字符串,说明返回值不是ERROR,表示读取sim卡的CCID成功,退出
gReceiveFlag = 0;
gReceiveBufferLen = 0;
memset(gReceiveBuffer,0,GPRSBUFFERLEN);
break;
}
}
}while(timeout<10);
if(timeout>10)
{
//报错
return false;
}
return true;
}
/***************************************************************************************
*函数名称:Gprs_CheckAT(void)
*函数描述:检查串口是否通,收到OK,则说明串口已接通
*AT指令:“AT\r"
*入口参数:无
*出口参数:返回一个bool值
****************************************************************************************/
bool Gprs_CheckAT(void)
{
int timeout=0;
// char str[35];
do
{
timeout++;
Gprs_SendATCommand("AT\r",3); //通过串口发送AT回车
Gprs_Delayms(100);
if(gReceiveFlag == 1)
{
//UART0_snd((unsigned char *)gReceiveBuffer,gReceiveBufferLen);
if(strstr((char *)gReceiveBuffer,"OK")>0)
{
//说明串口通,退出
gReceiveFlag = 0;
gReceiveBufferLen = 0;
memset(gReceiveBuffer,0,GPRSBUFFERLEN);
break;
}
}
}while(timeout<10);
if(timeout>=10)
{
//报错
// test+=100;
// sprintf(str,"%d",test);
// UART0_snd(str,sizeof(str));
// UART1_init(60000000, test);
return false;
}
return true;
}
/***************************************************************************************
*函数名称:Gprs_CheckCSQ(void)
*函数描述:检查信号强度,回显值:+CSQ:<rssi>,<ber>,其中rssi为查询接受信号
强度,值在0~31之间,值越大表示强度越强,若为99,则说明未知或不可检测;ber为信道
位错误率,值在0~7,若为99,则说明未知或不可检测
*AT指令:“AT+CSQ\r"
*入口参数:无
*出口参数:返回一个bool值
****************************************************************************************/
bool Gprs_CheckCSQ(void)
{
char *buf;
int timeout=0;
do
{
timeout++;
Gprs_SendATCommand("AT+CSQ\r",7); //检查信号强度
Gprs_Delayms(100);
if(gReceiveFlag == 1)
{
if(strstr(gReceiveBuffer,"+CSQ: 99,99")==0)
{
//说明检查的不是99,99,有信号,退出
buf =strstr(gReceiveBuffer,"+CSQ:");
if(sysconfig.Tishi ==0) UART0_snd("Signal: ",8);
if(sysconfig.Tishi ==0) UART0_snd((unsigned char*)&buf[6],2);
if(sysconfig.Tishi ==0) UART0_snd("\r\n",2);
gReceiveFlag = 0;
gReceiveBufferLen = 0;
memset(gReceiveBuffer,0,GPRSBUFFERLEN);
break;
}
}
}while(timeout<10);
if(timeout>=10)
{
return false;
}
return true;
}
/***************************************************************************************
*函数名称:Gprs_CheckCREG(void)
*函数描述:检查模块当前的网络注册状态,只有当回显值为0,1或0,5时,才表示网络注册成功
*AT指令:"AT+CREG?\r"
*入口参数:无
*出口参数:返回一个bool值
****************************************************************************************/
bool Gprs_CheckCREG(void)
{
int timeout; // 超时次数变量;
timeout = 0;
do
{
timeout++;
Gprs_SendATCommand("AT+CREG?\r",9);
// 通过串口发送AT+CREG?回车,查询模块的当前网络注册状态
Gprs_Delayms(100);
if(gReceiveFlag == 1)
{
if(strstr((char *)gReceiveBuffer,"+CREG: 0,1")>0 ||strstr((char *)gReceiveBuffer,"+CREG: 0,5")>0)//||strstr((char *)gReceiveBuffer,"OK")>0)
{
// 如果返回值为+CREG: 0,1或+CREG: 0,5,则网络注册成功
gReceiveFlag =0;
gReceiveBufferLen = 0;
memset(gReceiveBuffer,0,GPRSBUFFERLEN);
break;
}
}
}while(timeout<10);
if( timeout>=10 )
{
// 报错;说明网络注册失败!
return false;
}
return true;
}
/***************************************************************************************
*函数名称:Gprs_SetStack(void)
*函数描述:设置
*AT指令:"AT+CREG?\r"
*入口参数:无
*出口参数:返回一个bool值
****************************************************************************************/
bool Gprs_SetStack(void)
{
int timeout; // 超时次数变量;
timeout = 0;
do
{
timeout++;
Gprs_SendATCommand("AT+_XISP=0\r",10); //使用内部协议栈
// 通过串口发送AT+CREG?回车,查询模块的当前网络注册状态
Gprs_Delayms(100);
if(gReceiveFlag == 1)
{
if( strstr((char *)gReceiveBuffer,"OK")>0 )
{
// 如果返回值为+CREG: 0,1或+CREG: 0,5,则网络注册成功
gReceiveFlag =0;
gReceiveBufferLen = 0;
memset(gReceiveBuffer,0,GPRSBUFFERLEN);
break;
}
}
}while(timeout<10);
if( timeout>=10 )
{
// 报错;说明网络注册失败!
return false;
}
return true;
}
/***************************************************************************************
*函数名称:Gprs_CheckPPPLink(void)
*函数描述:建立PPP链接,
*AT指令:”AT+XIIC=1\r“
*入口参数:无
*出口参数:返回一个bool值
*注:1.在建立PPP链路之前,先要使用AT+CGDCONT设定APN等参数
2.设置AT+CGDCONT之前要先设置AT+XISP=0,即选择内部协议栈
3.在使用AT+XIIC=1建立PPP连接之前,先要确保模块已经注册上网络。可使用
AT+CREG?来判断,如果返回+CREG:0,1或+CREG:0,5,都表明已注册上网络。
****************************************************************************************/
bool Gprs_CreatePPPLink(void)
{
int timeout; // 超时次数变量;
timeout = 0;
do
{
timeout++;
Gprs_SendATCommand("AT+XIIC=1\r",10); //要求建立PPP连接
Gprs_Delayms(100); // 延时100ms
if(gReceiveFlag == 1)
{
if( strstr((char *)gReceiveBuffer,"OK")>0 )
{
// 如返回OK 跳出循环
gReceiveFlag = 0;
gReceiveBufferLen = 0;
memset(gReceiveBuffer,0,GPRSBUFFERLEN);
break;
}
}
}while(timeout<10);
if( timeout>=10 )
{
// 报错;说明PPP建立失败!
return false;
}
return true;
}
/***************************************************************************************
*函数名称:Gprs_CheckPPPStatus(void)
*函数描述:查询PPP链路状态
*AT指令:"AT+XIIC=?\r"
*入口参数:无
*出口参数:返回一个bool值
****************************************************************************************/
bool Gprs_CheckPPPStatus(void)
{
int value=0; // 超时次数变量;
char *pstr1,*pstr2;
do
{
value++;
Gprs_SendATCommand("AT+XIIC?\r",9);
//发送AT+XIIC=?查询链路状态
Gprs_Delayms(500); // 延时500ms;
if(gReceiveFlag == 1)
{
if( strstr((char *)gReceiveBuffer,"+XIIC: 1")>0 )
// if(strstr((char *)gReceiveBuffer,"OK")>0)
{
//判断返回值 如果返回+XIIC: 1, *.*.*.*,则跳出循环,1前面有4个空格
//result_ok = true;
pstr1=strstr((char *)gReceiveBuffer,"1,");
pstr2=strstr((char *)pstr1,"\r\n");
if((pstr2>pstr1)&&pstr1!=0) MyIPStrl=(pstr2-pstr1)-3;
else return false;
memcpy(MyIPStr,pstr1+3,MyIPStrl);
gReceiveFlag = 0;
gReceiveBufferLen = 0;
memset(gReceiveBuffer,0,GPRSBUFFERLEN);
if(sysconfig.Tishi ==0) UART0_snd("PPP Link OK\r\n",13);
if(sysconfig.Tishi ==0) UART0_snd("IP: ",4);
if(sysconfig.Tishi ==0) UART0_snd((unsigned char*)MyIPStr,MyIPStrl);
if(sysconfig.Tishi ==0) UART0_snd("\r\n",2);
break;
}
gReceiveFlag = 0;
gReceiveBufferLen = 0;
memset(gReceiveBuffer,0,GPRSBUFFERLEN);
}
}while(value<5);
if( value>=5 )
{
// 报错;说明PPP建立失败!
return false;
}
return true;
}
bool Search_IP(void)
{
char buffer[50];
unsigned char i,len;
char *pstr1,*pstr2;
int value=0; // 超时次数变量;
sprintf(buffer,"AT+DNS=");
buffer[7]=0x22;
for(i=8;i<sysconfig.gprs_station.lDomainName+8;i++) buffer[i]=sysconfig.gprs_station.DomainName[i-8];
buffer[i]=0x22;
len=i+1;
buffer[len]='\r';
len++;
Gprs_SendATCommand(buffer,len);//发送查询链路状态
do
{
value++;
Gprs_Delayms(1000); // 延时500ms;
if(gReceiveFlag == 1)
{ pstr2=strstr((char *)gReceiveBuffer,"+DNS:OK");
pstr1=strstr((char *)gReceiveBuffer,"+DNS:");
if( (pstr2!=NULL)&&(pstr1!=NULL)&&(pstr2>pstr1) )
// if(strstr((char *)gReceiveBuffer,"OK")>0)
{
//判断返回值 如果返回+XIIC: 1, *.*.*.*,则跳出循环,1前面有4个空格
DomainStrl=pstr2-pstr1;
DomainStrl-=7;
memcpy(DomainStr,pstr1+5,DomainStrl);
sprintf(&DomainStr[DomainStrl],",%d\r",sysconfig.gprs_station.Cport);
DomainStrl+=3;
gReceiveFlag = 0;
gReceiveBufferLen = 0;
memset(gReceiveBuffer,0,GPRSBUFFERLEN);
break;
}
// gReceiveFlag = 0;
// gReceiveBufferLen = 0;
// memset(gReceiveBuffer,0,GPRSBUFFERLEN);
}
}while(value<5);
if( value>=5 )
{ if(sysconfig.Tishi ==0) UART0_snd("Get IP By Domain Name False.\r\n",30);
Reset();// 报错;说明PPP建立失败!
return false;
}
return true;
}
/********************************************************************************
*函数名称:Gprs_CreateTCPLink(unsigned char *linkStr,int size)
*函数功能:建立TCP链接
*AT指令:AT+TCPSETUP=<n>,<ip>,<port>
其中n为链路编号0和1;ip为目的IP地址,必须是形如XX.XX.XX.XX的输入;
port为目的端口号,必须是十进制的ASCII码
*入口参数:所需发送的TCP指令 AT+TCPSETUP=<n>,<ip>,<port>,即包括所有信息的字符串
*出口参数:返回一个bool值
**********************************************************************************/
bool Gprs_CreateTCPLink(char *linkStr,int size)
{
int timeout; // 超时次数变量;
if( size<=0 )
return false;
timeout = 0;
Gprs_SendATCommand(linkStr,size);//发送AT指令建立TCP连接
Gprs_Delayms(500); // 延时500ms;
do
{
timeout++;
Gprs_Delayms(100); // 延时10ms;
if(gReceiveFlag == 1)
{
if( strstr((char *)gReceiveBuffer,"+TCPSETUP:0,OK")>0 )
{
//判断返回值 如果返回+TCPSETUP:0,OK,则跳出循环
gReceiveFlag = 0;
gReceiveBufferLen = 0;
memset(gReceiveBuffer,0,GPRSBUFFERLEN);
break;
}
}
}while(timeout<10);
if( timeout>=10 )
{
// 报错;说明TCP链接失败!
return false;
}
return true;
}
bool Gprs_CreateUDPLink(char *linkStr,int size)
{
int timeout; // 超时次数变量;
if( size<=0 )
return false;
timeout = 0;
Gprs_SendATCommand(linkStr,size);//发送AT指令建立TCP连接
Gprs_Delayms(500); // 延时500ms;
do
{
timeout++;
Gprs_Delayms(100); // 延时10ms;
if(gReceiveFlag == 1)
{
if( strstr((char *)gReceiveBuffer,"+UDPSETUP:1,OK")>0 )
{
//判断返回值 如果返回+UDPSETUP:1,OK,则跳出循环
gReceiveFlag = 0;
gReceiveBufferLen = 0;
memset(gReceiveBuffer,0,GPRSBUFFERLEN);
break;
}
}
}while(timeout<10);
if( timeout>=10 )
{
// 报错;说明UDP链接失败!
return false;
}
return true;
}
/***************************************************************************************
*函数名称:Gprs_CloseTCPLink(void)
*函数描述:关闭TCP链路
*AT指令:AT+TCPCLOSE=<n> 其中的n为链路号
*入口参数:无
*出口参数:返回一个bool值
****************************************************************************************/
bool Gprs_CloseTCPLink(void)
{
Gprs_SendATCommand("AT+TCPCLOSE=0\r",14);// 发送AT+TCPCLOSE=0回车
Gprs_Delayms(300);
return true;
}
bool Gprs_CloseUDPLink(void)
{
Gprs_SendATCommand("AT+UDPCLOSE=0\r",14);// 发送AT+UDPCLOSE=0回车
Gprs_Delayms(300);
return true;
}
/***************************************************************************************
*函数名称:Gprs_TCP_SendData(void)
*函数描述:发送TCP数据,这条命令发送完毕后,会接收到大于号">",这时候请延迟50ms~100ms,
然后发送数据
*AT指令:AT+TCPSEND=<n>,<length> 其中n为链路编号 length为要发送的数据长度,以字节为单位
取值范围1~200
*入口参数:无
*出口参数:返回一个bool值
****************************************************************************************/
bool Gprs_TCP_SendData(unsigned char *databuf,int size)
{
int timeout=0;
char sendtemp[20];
// 发送数据之前先使用AT+IPSTATUS查看可用 buffer的大小
do
{
timeout++;
Gprs_SendATCommand("AT+IPSTATUS=0\r",14);//发送AT+IPSTATUS=0回车查询TCP链路状态
Gprs_Delayms(300);
if(gReceiveFlag == 1)
{
if( strstr((char *)gReceiveBuffer,"+IPSTATUS:0,CONNECT,TCP")>0 )
{
//链路0建立连接
gReceiveFlag =0;
gReceiveBufferLen = 0;
memset(gReceiveBuffer,0,GPRSBUFFERLEN);
break;
}
if( strstr((char *)gReceiveBuffer,"+IPSTATUS:0,DISCONNECT")>0 )
{
// 报错;说明链路没有建立;
#ifdef DEBUG
UART0_snd("+IPSTATUS:0,DISCONNECT,TCP\r\n",28);
#endif
Reset();
}
gReceiveFlag =0;
gReceiveBufferLen = 0;
memset(gReceiveBuffer,0,GPRSBUFFERLEN);
}
}while(timeout<10);
if( timeout>=10 )
{
// 报错;说明TCP链接失败!
return false;
}
// 如果TCP状态OK 则开始发送TCP指令;
if(size<10)
{
sprintf(sendtemp,"AT+TCPSEND=0,%1d\r",size);
Gprs_SendATCommand(sendtemp,15); //发送 AT+TCPSEND=0,size回车,发送size个字节;
}
if((size<100)&&(size>10))
{
sprintf(sendtemp,"AT+TCPSEND=0,%2d\r",size);
Gprs_SendATCommand(sendtemp,16); //发送 AT+TCPSEND=0,size回车,发送size个字节;
}
else if((size>=100)&&(size<1000))
{
sprintf(sendtemp,"AT+TCPSEND=0,%3d\r",size);
Gprs_SendATCommand(sendtemp,17); //发送 AT+TCPSEND=0,size回车,发送size个字节;
}
else if(size>=1000)
{
sprintf(sendtemp,"AT+TCPSEND=0,%4d\r",size);
Gprs_SendATCommand(sendtemp,18);
}
// 判断接收发送符:">"
do
{
timeout++;
Gprs_Delayms(150); // 延时100ms;
if(gReceiveFlag == 1)
{
if( strstr((char *)gReceiveBuffer,">")>0 )
{
//判断返回值 如果返回>,则跳出循环,表示可以发送数据了;
gReceiveFlag = 0;
gReceiveBufferLen = 0;
memset(gReceiveBuffer,0,GPRSBUFFERLEN);
break;
}
}
}while(timeout<10);
if( timeout>=10 )
{
// 报错;说明没有收到 >,不能发送数据!
return false;
}
memcpy(gSendBuffer,databuf,size);
// 开始发送数据;发送数据时,必须在数据包的末尾加上0x0d 作为结束符,但该结束符不算到数据长度里,
gSendBuffer[size+1] = 0x0D;
UART1_snd(gSendBuffer,size+1); //发送size个字节数据和回车;记住数据最后要加回车符;
Gprs_Delayms(200); // 延时100ms;
if(gReceiveFlag == 1)
{
if( strstr((char *)gReceiveBuffer,"+TCPSEND:0,")>0 )
{
// 判断返回值 如果返回+TCPSEND:0,50;表示发送成功;
gReceiveFlag =0;
gReceiveBufferLen = 0;
memset(gReceiveBuffer,0,GPRSBUFFERLEN);
return true;
}
else if( strstr((char *)gReceiveBuffer,"+TCPSEND:Error")>0 )
{
// 判断返回值 如果返回+TCPSEND:Error;在链路0 上发送50字节的数据,该链路尚未建立,发送失败。
gReceiveFlag =0;
gReceiveBufferLen = 0;
memset(gReceiveBuffer,0,GPRSBUFFERLEN);
return false;
}
else if( strstr((char *)gReceiveBuffer,"+TCPSEND:Buffer not enough")>0 )
{
// 判断返回值 如果返回+TCPSEND:Buffer not enough;在链路0 上发送50字节的数据,内部buffer不足,发送失败。
gReceiveFlag =0;
gReceiveBufferLen = 0;
memset(gReceiveBuffer,0,GPRSBUFFERLEN);
return false;
}
}
return true;
// 根据情况加上相应的代码进行处理 ....
}
bool Gprs_UDP_SendData(unsigned char *databuf,int size)
{
int timeout=0;
char sendtemp[20];
// 发送数据之前先使用AT+IPSTATUS查看可用 buffer的大小
do
{
timeout++;
Gprs_SendATCommand("AT+IPSTATUS=1\r",14);//发送AT+IPSTATUS=0回车查询TCP链路状态
Gprs_Delayms(300);
if(gReceiveFlag == 1)
{
if( strstr((char *)gReceiveBuffer,"+IPSTATUS:1,CONNECT,UDP")>0 )
{
//链路0建立连接
gReceiveFlag =0;
gReceiveBufferLen = 0;
memset(gReceiveBuffer,0,GPRSBUFFERLEN);
break;
}
if( strstr((char *)gReceiveBuffer,"+IPSTATUS:1,DISCONNECT")>0 )
{
// 报错;说明链路没有建立;
#ifdef DEBUG
UART0_snd("+IPSTATUS:1,DISCONNECT,UDP\r\n",28);
#endif
Reset();
}
gReceiveFlag =0;
gReceiveBufferLen = 0;
memset(gReceiveBuffer,0,GPRSBUFFERLEN);
}
}while(timeout<10);
if( timeout>=10 )
{
// 报错;说明TCP链接失败!
return false;
}
// 如果TCP状态OK 则开始发送TCP指令;
if(size<10)
{
sprintf(sendtemp,"AT+UDPSEND=1,%1d\r",size);
Gprs_SendATCommand(sendtemp,15); //发送 AT+TCPSEND=0,size回车,发送size个字节;
}
if((size<100)&&(size>10))
{
sprintf(sendtemp,"AT+UDPSEND=1,%2d\r",size);
Gprs_SendATCommand(sendtemp,16); //发送 AT+TCPSEND=0,size回车,发送size个字节;
}
else if((size>=100)&&(size<1000))
{
sprintf(sendtemp,"AT+UDPSEND=1,%3d\r",size);
Gprs_SendATCommand(sendtemp,17); //发送 AT+TCPSEND=0,size回车,发送size个字节;
}
else if(size>=1000)
{
sprintf(sendtemp,"AT+UDPSEND=1,%4d\r",size);
Gprs_SendATCommand(sendtemp,18);
}
// 判断接收发送符:">"
do
{
timeout++;
Gprs_Delayms(150); // 延时100ms;
if(gReceiveFlag == 1)
{
if( strstr((char *)gReceiveBuffer,">")>0 )
{
//判断返回值 如果返回>,则跳出循环,表示可以发送数据了;
gReceiveFlag = 0;
gReceiveBufferLen = 0;
memset(gReceiveBuffer,0,GPRSBUFFERLEN);
break;
}
}
}while(timeout<10);
if( timeout>=10 )
{
// 报错;说明没有收到 >,不能发送数据!
return false;
}
memcpy(gSendBuffer,databuf,size);
// 开始发送数据;发送数据时,必须在数据包的末尾加上0x0d 作为结束符,但该结束符不算到数据长度里,
gSendBuffer[size+1] = 0x0D;
UART1_snd(gSendBuffer,size+1); //发送size个字节数据和回车;记住数据最后要加回车符;
Gprs_Delayms(200); // 延时100ms;
if(gReceiveFlag == 1)
{
if( strstr((char *)gReceiveBuffer,"+UDPSEND:0,")>0 )
{
// 判断返回值 如果返回+TCPSEND:0,50;表示发送成功;
gReceiveFlag =0;
gReceiveBufferLen = 0;
memset(gReceiveBuffer,0,GPRSBUFFERLEN);
return true;
}
else if( strstr((char *)gReceiveBuffer,"+UDPSEND:Error")>0 )
{
// 判断返回值 如果返回+TCPSEND:Error;在链路0 上发送50字节的数据,该链路尚未建立,发送失败。
gReceiveFlag =0;
gReceiveBufferLen = 0;
memset(gReceiveBuffer,0,GPRSBUFFERLEN);
return false;
}
else if( strstr((char *)gReceiveBuffer,"+UDPSEND:Buffer not enough")>0 )
{
// 判断返回值 如果返回+TCPSEND:Buffer not enough;在链路0 上发送50字节的数据,内部buffer不足,发送失败。
gReceiveFlag =0;
gReceiveBufferLen = 0;
memset(gReceiveBuffer,0,GPRSBUFFERLEN);
return false;
}
}
return true;
// 根据情况加上相应的代码进行处理 ....
}
/***************************************************************************************
*函数名称:Gprs_TCP_ReceiveData(void)
*函数描述:接收TCP数据
*入口参数:无
*出口参数:返回一个bool值
****************************************************************************************/
bool Gprs_TCP_ReceiveData(void)
{
unsigned long recvlen;
unsigned char i;
Gprs_Delayms(500);
if(gReceiveFlag == 1)
{
if( strstr((char *)gReceiveBuffer,"+TCPRECV:0")>0 )
{// 如果返回+TCPRECV:0
// 解析后面的长度和数据;在这里加上代码;
if(gReceiveBuffer[12] == 0x2C)
{
for(i=0;i<4;i++)
{
if(gReceiveBuffer[13+i] == 0x2C) break;
}
if(i==4)
{
goto rcverr;
}
if(i==1)
{
recvlen = (gReceiveBuffer[13]-0x30);
if(recvlen > GPRSBUFFERLEN)
{
goto rcverr;
}
AppDataGprsRcv((unsigned char *)&gReceiveBuffer[15], recvlen);
}
if(i==2)
{
recvlen = (gReceiveBuffer[13]-0x30)*10+(gReceiveBuffer[14]-0x30);
if(recvlen > GPRSBUFFERLEN)
{
goto rcverr;
}
AppDataGprsRcv((unsigned char *)gReceiveBuffer+16, recvlen);
}
if(i==3)
{
recvlen = (gReceiveBuffer[13]-0x30)*100+(gReceiveBuffer[14]-0x30)*10+(gReceiveBuffer[15]-0x30);
if(recvlen > GPRSBUFFERLEN)
{
goto rcverr;
}
AppDataGprsRcv((unsigned char *)gReceiveBuffer+17, recvlen);
}
}
else
{
rcverr: gReceiveFlag = 0;
gReceiveBufferLen = 0;
memset(gReceiveBuffer,0,GPRSBUFFERLEN);
return false;
}
gReceiveFlag = 0;
gReceiveBufferLen = 0;
memset(gReceiveBuffer,0,GPRSBUFFERLEN);
return true;
}
}
gReceiveFlag = 0;
gReceiveBufferLen = 0;
memset(gReceiveBuffer,0,GPRSBUFFERLEN);
return false;
}
bool Gprs_UDP_ReceiveData(void)
{
unsigned long recvlen;
unsigned char i;
Gprs_Delayms(500);
if(gReceiveFlag == 1)
{
if( strstr((char *)gReceiveBuffer,"+UDPRECV:1")>0 )
{// 如果返回+TCPRECV:0
// 解析后面的长度和数据;在这里加上代码;
if(gReceiveBuffer[12] == 0x2C)
{
for(i=0;i<4;i++)
{
if(gReceiveBuffer[13+i] == 0x2C) break;
}
if(i==4)
{
goto rcverr;
}
if(i==1)
{
recvlen = (gReceiveBuffer[13]-0x30);
if(recvlen > GPRSBUFFERLEN)
{
goto rcverr;
}
AppDataGprsRcv((unsigned char *)&gReceiveBuffer[15], recvlen);
}
if(i==2)
{
recvlen = (gReceiveBuffer[13]-0x30)*10+(gReceiveBuffer[14]-0x30);
if(recvlen > GPRSBUFFERLEN)
{
goto rcverr;
}
AppDataGprsRcv((unsigned char *)gReceiveBuffer+16, recvlen);
}
if(i==3)
{
recvlen = (gReceiveBuffer[13]-0x30)*100+(gReceiveBuffer[14]-0x30)*10+(gReceiveBuffer[15]-0x30);
if(recvlen > GPRSBUFFERLEN)
{
goto rcverr;
}
AppDataGprsRcv((unsigned char *)gReceiveBuffer+17, recvlen);
}
}
else
{
rcverr: gReceiveFlag = 0;
gReceiveBufferLen = 0;
memset(gReceiveBuffer,0,GPRSBUFFERLEN);
return false;
}
gReceiveFlag = 0;
gReceiveBufferLen = 0;
memset(gReceiveBuffer,0,GPRSBUFFERLEN);
return true;
}
}
gReceiveFlag = 0;
gReceiveBufferLen = 0;
memset(gReceiveBuffer,0,GPRSBUFFERLEN);
return false;
}
/***************************************************************************************
*函数名称:Gprs_SingleTCPLink(unsigned char iLinkNum,char *strServerIP,char *strPort)
*函数描述:创建单TCP链路
*AT指令:AT+TCPSETUP=<n>,<ip>,<port>
*入口参数:无
*出口参数:返回一个bool值
****************************************************************************************/
bool Gprs_SingleTCPLink(unsigned char iLinkNum,unsigned char *strServerIP,unsigned short strPort)
{
unsigned int length;
char buffer[50];
memset(buffer,0x00,sizeof(buffer));
sprintf(buffer,"AT+TCPSETUP=%d,%d.%d.%d.%d,%d\r",iLinkNum,
strServerIP[0],
strServerIP[1],
strServerIP[2],
strServerIP[3],
strPort);
length = strlen((char *)buffer);
if( !Gprs_CreateTCPLink(buffer,length) )
{
return false;// 建立TCP连接失败;
}
return true;
}
bool Gprs_SingleUDPLink(unsigned char iLinkNum,unsigned char *strServerIP,unsigned short strPort)
{
unsigned int length;
char buffer[50];
memset(buffer,0x00,sizeof(buffer));
sprintf(buffer,"AT+UDPSETUP=%d,%d.%d.%d.%d,%d\r",iLinkNum,
strServerIP[0],
strServerIP[1],
strServerIP[2],
strServerIP[3],
strPort);
length = strlen((char *)buffer);
if( !Gprs_CreateUDPLink(buffer,length) )
{
return false;// 建立TCP连接失败;
}
return true;
}
bool Gprs_DomainTCPLink(unsigned char iLinkNum)
{
unsigned int length;
char buffer[50];
memset(buffer,0x00,sizeof(buffer));
sprintf(buffer,"AT+TCPSETUP=%d,",iLinkNum);
length = strlen((char *)buffer);
sprintf(&buffer[length],DomainStr);
length = strlen((char *)buffer);
if( !Gprs_CreateTCPLink(buffer,length) )
{
return false;// 建立TCP连接失败;
}
return true;
}
bool Gprs_DomainUDPLink(unsigned char iLinkNum)
{
unsigned int length;
char buffer[50];
memset(buffer,0x00,sizeof(buffer));
sprintf(buffer,"AT+UDPSETUP=%d,",iLinkNum);
length = strlen((char *)buffer);
sprintf(&buffer[length],DomainStr);
length = strlen((char *)buffer);
if( !Gprs_CreateUDPLink(buffer,length) )
{
return false;// 建立TCP连接失败;
}
return true;
}
/***************************************************************************************
*函数名称:Gprs_SendATCommand(char *strCmd,unsigned long len)
*函数描述:发送AT指令函数
*入口参数:发送字符串,及长度
*出口参数:返回一个bool值
****************************************************************************************/
bool Gprs_SendATCommand(char *strCmd,unsigned long len)
{
if(len<=0)
return false;
UART1_snd((unsigned char*)strCmd,len);
return true;
}
///***************************************************************************************
// *函数名称:Gprs_ReceiveFromUart(char *data,unsigned long len)
// *函数描述:从串口中接收数据
// *入口参数:接收到的字符串及长度
// *出口参数:无
// ****************************************************************************************/
//void Gprs_ReceiveFromUart(char *data,unsigned long len)
//{
// unsigned char i;
// unsigned long buflen;
// if(gReceiveFlag==0)
// {
// memset(gReceiveBuffer ,0x00,sizeof(gReceiveBuffer));
// memcpy(gReceiveBuffer,data,len);
// gReceiveBufferLen = len;
// gReceiveFlag= 1;
// }
// else
// {
……………………
…………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
7213-Modbus.zip
(921.66 KB, 下载次数: 20)
2018-10-6 15:52 上传
点击文件名下载附件
下载积分: 黑币 -5
作者:
admin
时间:
2018-10-7 00:17
补全原理图或者详细说明一下电路连接即可获得100+黑币
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1