完整實際應用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
|