久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费
標題:
完整實際應用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.zg4o1577.cn/bbs/)
Powered by Discuz! X3.1
主站蜘蛛池模板:
手机在线不卡av
|
综合久久99
|
欧美日韩专区
|
国产精品一区二区三区免费观看
|
天堂国产
|
国产一级在线观看
|
国产一二三区电影
|
亚洲午夜精品一区二区三区他趣
|
伊人久久精品一区二区三区
|
成人一区二区三区
|
亚洲精品18
|
午夜影院网站
|
国产综合在线视频
|
日本精品久久久久久久
|
亚洲精品乱码久久久久v最新版
|
日韩电影免费在线观看中文字幕
|
最新国产福利在线
|
欧美理论
|
97国产一区二区精品久久呦
|
亚洲日韩中文字幕一区
|
在线一区二区三区
|
国产成人免费观看
|
亚洲+变态+欧美+另类+精品
|
天天色影视综合
|
老司机免费视频
|
福利视频大全
|
91免费看片
|
精品视频一区二区
|
欧美日韩高清在线一区
|
乱码av午夜噜噜噜噜动漫
|
亚洲精品久
|
中文一区
|
精品在线一区
|
99精品国产一区二区三区
|
欧美日韩在线视频一区二区
|
免费看的黄网站
|
亚洲va国产日韩欧美精品色婷婷
|
www.日韩系列
|
中文字幕亚洲精品
|
www.天天干.com
|
日韩中文久久
|