標(biāo)題:
完整實際應(yīng)用NXP modbus編程實例
[打印本頁]
作者:
liu100m
時間:
2018-10-6 15:53
標(biāo)題:
完整實際應(yīng)用NXP modbus編程實例
完整實際應(yīng)用NXP modbus編程實例。包括modbus協(xié)議,flash 編程
0.png
(10.6 KB, 下載次數(shù): 34)
下載附件
2018-10-7 00:16 上傳
單片機(jī)源程序如下:
#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;
//創(chuàng)建多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);
}
/*****************************************************
*函數(shù)名稱:Gprs_Delayms(unsigned timelen)
*函數(shù)描述:ms級的延遲函數(shù)
*入口參數(shù):需要延遲的時間
*出口參數(shù):無
*****************************************************/
void Gprs_Delayms(unsigned int timelen)
{
unsigned int i,count;
for(i=0;i<timelen;i++)
{ count=11460;
while(count--); //10000大約1ms
}
}
/***************************************************************************************
*函數(shù)名稱:Gprs_CheckPBReady(void)
*函數(shù)描述:檢查是否收到+PBReady,只有接收到“+PBREADY”后,才開始對模塊進(jìn)行AT指令操作。
*入口參數(shù):無
*出口參數(shù):返回一個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;
}
/*****************************************************
*函數(shù)名稱:Gprs_CheckCCID(void)
*函數(shù)描述:檢查SIM卡標(biāo)識信息
*AT指令:“AT+CCID\r"
*入口參數(shù):無
*出口參數(shù):返回一個bool值
*****************************************************/
bool Gprs_CheckCCID(void)
{
int timeout=0; //超時次數(shù)變量
do
{
timeout++;
Gprs_SendATCommand("AT+CCID\r",8);
//通過串口發(fā)送AT+CCID回車,獲取SIM卡標(biāo)識
Gprs_Delayms(200); //延時200ms
if(gReceiveFlag == 1)
{
//判斷接受緩沖區(qū)是否有數(shù)據(jù)
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;
}
/***************************************************************************************
*函數(shù)名稱:Gprs_CheckAT(void)
*函數(shù)描述:檢查串口是否通,收到OK,則說明串口已接通
*AT指令:“AT\r"
*入口參數(shù):無
*出口參數(shù):返回一個bool值
****************************************************************************************/
bool Gprs_CheckAT(void)
{
int timeout=0;
// char str[35];
do
{
timeout++;
Gprs_SendATCommand("AT\r",3); //通過串口發(fā)送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;
}
/***************************************************************************************
*函數(shù)名稱:Gprs_CheckCSQ(void)
*函數(shù)描述:檢查信號強(qiáng)度,回顯值:+CSQ:<rssi>,<ber>,其中rssi為查詢接受信號
強(qiáng)度,值在0~31之間,值越大表示強(qiáng)度越強(qiáng),若為99,則說明未知或不可檢測;ber為信道
位錯誤率,值在0~7,若為99,則說明未知或不可檢測
*AT指令:“AT+CSQ\r"
*入口參數(shù):無
*出口參數(shù):返回一個bool值
****************************************************************************************/
bool Gprs_CheckCSQ(void)
{
char *buf;
int timeout=0;
do
{
timeout++;
Gprs_SendATCommand("AT+CSQ\r",7); //檢查信號強(qiáng)度
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;
}
/***************************************************************************************
*函數(shù)名稱:Gprs_CheckCREG(void)
*函數(shù)描述:檢查模塊當(dāng)前的網(wǎng)絡(luò)注冊狀態(tài),只有當(dāng)回顯值為0,1或0,5時,才表示網(wǎng)絡(luò)注冊成功
*AT指令:"AT+CREG?\r"
*入口參數(shù):無
*出口參數(shù):返回一個bool值
****************************************************************************************/
bool Gprs_CheckCREG(void)
{
int timeout; // 超時次數(shù)變量;
timeout = 0;
do
{
timeout++;
Gprs_SendATCommand("AT+CREG?\r",9);
// 通過串口發(fā)送AT+CREG?回車,查詢模塊的當(dāng)前網(wǎng)絡(luò)注冊狀態(tài)
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,則網(wǎng)絡(luò)注冊成功
gReceiveFlag =0;
gReceiveBufferLen = 0;
memset(gReceiveBuffer,0,GPRSBUFFERLEN);
break;
}
}
}while(timeout<10);
if( timeout>=10 )
{
// 報錯;說明網(wǎng)絡(luò)注冊失敗!
return false;
}
return true;
}
/***************************************************************************************
*函數(shù)名稱:Gprs_SetStack(void)
*函數(shù)描述:設(shè)置
*AT指令:"AT+CREG?\r"
*入口參數(shù):無
*出口參數(shù):返回一個bool值
****************************************************************************************/
bool Gprs_SetStack(void)
{
int timeout; // 超時次數(shù)變量;
timeout = 0;
do
{
timeout++;
Gprs_SendATCommand("AT+_XISP=0\r",10); //使用內(nèi)部協(xié)議棧
// 通過串口發(fā)送AT+CREG?回車,查詢模塊的當(dāng)前網(wǎng)絡(luò)注冊狀態(tài)
Gprs_Delayms(100);
if(gReceiveFlag == 1)
{
if( strstr((char *)gReceiveBuffer,"OK")>0 )
{
// 如果返回值為+CREG: 0,1或+CREG: 0,5,則網(wǎng)絡(luò)注冊成功
gReceiveFlag =0;
gReceiveBufferLen = 0;
memset(gReceiveBuffer,0,GPRSBUFFERLEN);
break;
}
}
}while(timeout<10);
if( timeout>=10 )
{
// 報錯;說明網(wǎng)絡(luò)注冊失!
return false;
}
return true;
}
/***************************************************************************************
*函數(shù)名稱:Gprs_CheckPPPLink(void)
*函數(shù)描述:建立PPP鏈接,
*AT指令:”AT+XIIC=1\r“
*入口參數(shù):無
*出口參數(shù):返回一個bool值
*注:1.在建立PPP鏈路之前,先要使用AT+CGDCONT設(shè)定APN等參數(shù)
2.設(shè)置AT+CGDCONT之前要先設(shè)置AT+XISP=0,即選擇內(nèi)部協(xié)議棧
3.在使用AT+XIIC=1建立PPP連接之前,先要確保模塊已經(jīng)注冊上網(wǎng)絡(luò)?墒褂
AT+CREG?來判斷,如果返回+CREG:0,1或+CREG:0,5,都表明已注冊上網(wǎng)絡(luò)。
****************************************************************************************/
bool Gprs_CreatePPPLink(void)
{
int timeout; // 超時次數(shù)變量;
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 跳出循環(huán)
gReceiveFlag = 0;
gReceiveBufferLen = 0;
memset(gReceiveBuffer,0,GPRSBUFFERLEN);
break;
}
}
}while(timeout<10);
if( timeout>=10 )
{
// 報錯;說明PPP建立失敗!
return false;
}
return true;
}
/***************************************************************************************
*函數(shù)名稱:Gprs_CheckPPPStatus(void)
*函數(shù)描述:查詢PPP鏈路狀態(tài)
*AT指令:"AT+XIIC=?\r"
*入口參數(shù):無
*出口參數(shù):返回一個bool值
****************************************************************************************/
bool Gprs_CheckPPPStatus(void)
{
int value=0; // 超時次數(shù)變量;
char *pstr1,*pstr2;
do
{
value++;
Gprs_SendATCommand("AT+XIIC?\r",9);
//發(fā)送AT+XIIC=?查詢鏈路狀態(tài)
Gprs_Delayms(500); // 延時500ms;
if(gReceiveFlag == 1)
{
if( strstr((char *)gReceiveBuffer,"+XIIC: 1")>0 )
// if(strstr((char *)gReceiveBuffer,"OK")>0)
{
//判斷返回值 如果返回+XIIC: 1, *.*.*.*,則跳出循環(huán),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; // 超時次數(shù)變量;
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);//發(fā)送查詢鏈路狀態(tài)
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, *.*.*.*,則跳出循環(huán),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;
}
/********************************************************************************
*函數(shù)名稱:Gprs_CreateTCPLink(unsigned char *linkStr,int size)
*函數(shù)功能:建立TCP鏈接
*AT指令:AT+TCPSETUP=<n>,<ip>,<port>
其中n為鏈路編號0和1;ip為目的IP地址,必須是形如XX.XX.XX.XX的輸入;
port為目的端口號,必須是十進(jìn)制的ASCII碼
*入口參數(shù):所需發(fā)送的TCP指令 AT+TCPSETUP=<n>,<ip>,<port>,即包括所有信息的字符串
*出口參數(shù):返回一個bool值
**********************************************************************************/
bool Gprs_CreateTCPLink(char *linkStr,int size)
{
int timeout; // 超時次數(shù)變量;
if( size<=0 )
return false;
timeout = 0;
Gprs_SendATCommand(linkStr,size);//發(fā)送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,則跳出循環(huán)
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; // 超時次數(shù)變量;
if( size<=0 )
return false;
timeout = 0;
Gprs_SendATCommand(linkStr,size);//發(fā)送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,則跳出循環(huán)
gReceiveFlag = 0;
gReceiveBufferLen = 0;
memset(gReceiveBuffer,0,GPRSBUFFERLEN);
break;
}
}
}while(timeout<10);
if( timeout>=10 )
{
// 報錯;說明UDP鏈接失!
return false;
}
return true;
}
/***************************************************************************************
*函數(shù)名稱:Gprs_CloseTCPLink(void)
*函數(shù)描述:關(guān)閉TCP鏈路
*AT指令:AT+TCPCLOSE=<n> 其中的n為鏈路號
*入口參數(shù):無
*出口參數(shù):返回一個bool值
****************************************************************************************/
bool Gprs_CloseTCPLink(void)
{
Gprs_SendATCommand("AT+TCPCLOSE=0\r",14);// 發(fā)送AT+TCPCLOSE=0回車
Gprs_Delayms(300);
return true;
}
bool Gprs_CloseUDPLink(void)
{
Gprs_SendATCommand("AT+UDPCLOSE=0\r",14);// 發(fā)送AT+UDPCLOSE=0回車
Gprs_Delayms(300);
return true;
}
/***************************************************************************************
*函數(shù)名稱:Gprs_TCP_SendData(void)
*函數(shù)描述:發(fā)送TCP數(shù)據(jù),這條命令發(fā)送完畢后,會接收到大于號">",這時候請延遲50ms~100ms,
然后發(fā)送數(shù)據(jù)
*AT指令:AT+TCPSEND=<n>,<length> 其中n為鏈路編號 length為要發(fā)送的數(shù)據(jù)長度,以字節(jié)為單位
取值范圍1~200
*入口參數(shù):無
*出口參數(shù):返回一個bool值
****************************************************************************************/
bool Gprs_TCP_SendData(unsigned char *databuf,int size)
{
int timeout=0;
char sendtemp[20];
// 發(fā)送數(shù)據(jù)之前先使用AT+IPSTATUS查看可用 buffer的大小
do
{
timeout++;
Gprs_SendATCommand("AT+IPSTATUS=0\r",14);//發(fā)送AT+IPSTATUS=0回車查詢TCP鏈路狀態(tài)
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狀態(tài)OK 則開始發(fā)送TCP指令;
if(size<10)
{
sprintf(sendtemp,"AT+TCPSEND=0,%1d\r",size);
Gprs_SendATCommand(sendtemp,15); //發(fā)送 AT+TCPSEND=0,size回車,發(fā)送size個字節(jié);
}
if((size<100)&&(size>10))
{
sprintf(sendtemp,"AT+TCPSEND=0,%2d\r",size);
Gprs_SendATCommand(sendtemp,16); //發(fā)送 AT+TCPSEND=0,size回車,發(fā)送size個字節(jié);
}
else if((size>=100)&&(size<1000))
{
sprintf(sendtemp,"AT+TCPSEND=0,%3d\r",size);
Gprs_SendATCommand(sendtemp,17); //發(fā)送 AT+TCPSEND=0,size回車,發(fā)送size個字節(jié);
}
else if(size>=1000)
{
sprintf(sendtemp,"AT+TCPSEND=0,%4d\r",size);
Gprs_SendATCommand(sendtemp,18);
}
// 判斷接收發(fā)送符:">"
do
{
timeout++;
Gprs_Delayms(150); // 延時100ms;
if(gReceiveFlag == 1)
{
if( strstr((char *)gReceiveBuffer,">")>0 )
{
//判斷返回值 如果返回>,則跳出循環(huán),表示可以發(fā)送數(shù)據(jù)了;
gReceiveFlag = 0;
gReceiveBufferLen = 0;
memset(gReceiveBuffer,0,GPRSBUFFERLEN);
break;
}
}
}while(timeout<10);
if( timeout>=10 )
{
// 報錯;說明沒有收到 >,不能發(fā)送數(shù)據(jù)!
return false;
}
memcpy(gSendBuffer,databuf,size);
// 開始發(fā)送數(shù)據(jù);發(fā)送數(shù)據(jù)時,必須在數(shù)據(jù)包的末尾加上0x0d 作為結(jié)束符,但該結(jié)束符不算到數(shù)據(jù)長度里,
gSendBuffer[size+1] = 0x0D;
UART1_snd(gSendBuffer,size+1); //發(fā)送size個字節(jié)數(shù)據(jù)和回車;記住數(shù)據(jù)最后要加回車符;
Gprs_Delayms(200); // 延時100ms;
if(gReceiveFlag == 1)
{
if( strstr((char *)gReceiveBuffer,"+TCPSEND:0,")>0 )
{
// 判斷返回值 如果返回+TCPSEND:0,50;表示發(fā)送成功;
gReceiveFlag =0;
gReceiveBufferLen = 0;
memset(gReceiveBuffer,0,GPRSBUFFERLEN);
return true;
}
else if( strstr((char *)gReceiveBuffer,"+TCPSEND:Error")>0 )
{
// 判斷返回值 如果返回+TCPSEND:Error;在鏈路0 上發(fā)送50字節(jié)的數(shù)據(jù),該鏈路尚未建立,發(fā)送失敗。
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 上發(fā)送50字節(jié)的數(shù)據(jù),內(nèi)部buffer不足,發(fā)送失敗。
gReceiveFlag =0;
gReceiveBufferLen = 0;
memset(gReceiveBuffer,0,GPRSBUFFERLEN);
return false;
}
}
return true;
// 根據(jù)情況加上相應(yīng)的代碼進(jìn)行處理 ....
}
bool Gprs_UDP_SendData(unsigned char *databuf,int size)
{
int timeout=0;
char sendtemp[20];
// 發(fā)送數(shù)據(jù)之前先使用AT+IPSTATUS查看可用 buffer的大小
do
{
timeout++;
Gprs_SendATCommand("AT+IPSTATUS=1\r",14);//發(fā)送AT+IPSTATUS=0回車查詢TCP鏈路狀態(tài)
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狀態(tài)OK 則開始發(fā)送TCP指令;
if(size<10)
{
sprintf(sendtemp,"AT+UDPSEND=1,%1d\r",size);
Gprs_SendATCommand(sendtemp,15); //發(fā)送 AT+TCPSEND=0,size回車,發(fā)送size個字節(jié);
}
if((size<100)&&(size>10))
{
sprintf(sendtemp,"AT+UDPSEND=1,%2d\r",size);
Gprs_SendATCommand(sendtemp,16); //發(fā)送 AT+TCPSEND=0,size回車,發(fā)送size個字節(jié);
}
else if((size>=100)&&(size<1000))
{
sprintf(sendtemp,"AT+UDPSEND=1,%3d\r",size);
Gprs_SendATCommand(sendtemp,17); //發(fā)送 AT+TCPSEND=0,size回車,發(fā)送size個字節(jié);
}
else if(size>=1000)
{
sprintf(sendtemp,"AT+UDPSEND=1,%4d\r",size);
Gprs_SendATCommand(sendtemp,18);
}
// 判斷接收發(fā)送符:">"
do
{
timeout++;
Gprs_Delayms(150); // 延時100ms;
if(gReceiveFlag == 1)
{
if( strstr((char *)gReceiveBuffer,">")>0 )
{
//判斷返回值 如果返回>,則跳出循環(huán),表示可以發(fā)送數(shù)據(jù)了;
gReceiveFlag = 0;
gReceiveBufferLen = 0;
memset(gReceiveBuffer,0,GPRSBUFFERLEN);
break;
}
}
}while(timeout<10);
if( timeout>=10 )
{
// 報錯;說明沒有收到 >,不能發(fā)送數(shù)據(jù)!
return false;
}
memcpy(gSendBuffer,databuf,size);
// 開始發(fā)送數(shù)據(jù);發(fā)送數(shù)據(jù)時,必須在數(shù)據(jù)包的末尾加上0x0d 作為結(jié)束符,但該結(jié)束符不算到數(shù)據(jù)長度里,
gSendBuffer[size+1] = 0x0D;
UART1_snd(gSendBuffer,size+1); //發(fā)送size個字節(jié)數(shù)據(jù)和回車;記住數(shù)據(jù)最后要加回車符;
Gprs_Delayms(200); // 延時100ms;
if(gReceiveFlag == 1)
{
if( strstr((char *)gReceiveBuffer,"+UDPSEND:0,")>0 )
{
// 判斷返回值 如果返回+TCPSEND:0,50;表示發(fā)送成功;
gReceiveFlag =0;
gReceiveBufferLen = 0;
memset(gReceiveBuffer,0,GPRSBUFFERLEN);
return true;
}
else if( strstr((char *)gReceiveBuffer,"+UDPSEND:Error")>0 )
{
// 判斷返回值 如果返回+TCPSEND:Error;在鏈路0 上發(fā)送50字節(jié)的數(shù)據(jù),該鏈路尚未建立,發(fā)送失敗。
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 上發(fā)送50字節(jié)的數(shù)據(jù),內(nèi)部buffer不足,發(fā)送失敗。
gReceiveFlag =0;
gReceiveBufferLen = 0;
memset(gReceiveBuffer,0,GPRSBUFFERLEN);
return false;
}
}
return true;
// 根據(jù)情況加上相應(yīng)的代碼進(jìn)行處理 ....
}
/***************************************************************************************
*函數(shù)名稱:Gprs_TCP_ReceiveData(void)
*函數(shù)描述:接收TCP數(shù)據(jù)
*入口參數(shù):無
*出口參數(shù):返回一個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
// 解析后面的長度和數(shù)據(jù);在這里加上代碼;
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
// 解析后面的長度和數(shù)據(jù);在這里加上代碼;
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;
}
/***************************************************************************************
*函數(shù)名稱:Gprs_SingleTCPLink(unsigned char iLinkNum,char *strServerIP,char *strPort)
*函數(shù)描述:創(chuàng)建單TCP鏈路
*AT指令:AT+TCPSETUP=<n>,<ip>,<port>
*入口參數(shù):無
*出口參數(shù):返回一個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;
}
/***************************************************************************************
*函數(shù)名稱:Gprs_SendATCommand(char *strCmd,unsigned long len)
*函數(shù)描述:發(fā)送AT指令函數(shù)
*入口參數(shù):發(fā)送字符串,及長度
*出口參數(shù):返回一個bool值
****************************************************************************************/
bool Gprs_SendATCommand(char *strCmd,unsigned long len)
{
if(len<=0)
return false;
UART1_snd((unsigned char*)strCmd,len);
return true;
}
///***************************************************************************************
// *函數(shù)名稱:Gprs_ReceiveFromUart(char *data,unsigned long len)
// *函數(shù)描述:從串口中接收數(shù)據(jù)
// *入口參數(shù):接收到的字符串及長度
// *出口參數(shù):無
// ****************************************************************************************/
//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黑下載附件…………
復(fù)制代碼
所有資料51hei提供下載:
7213-Modbus.zip
(921.66 KB, 下載次數(shù): 20)
2018-10-6 15:52 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
作者:
admin
時間:
2018-10-7 00:17
補(bǔ)全原理圖或者詳細(xì)說明一下電路連接即可獲得100+黑幣
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1