|
完整實(shí)際應(yīng)用NXP modbus編程實(shí)例。包括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啟動(dòng)時(shí)序******/
- // 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級(jí)的延遲函數(shù)
- *入口參數(shù):需要延遲的時(shí)間
- *出口參數(shù):無(wú)
- *****************************************************/
- 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”后,才開(kāi)始對(duì)模塊進(jìn)行AT指令操作。
- *入口參數(shù):無(wú)
- *出口參數(shù):返回一個(gè)bool值
- ****************************************************************************************/
- bool Gprs_CheckPBReady(void)
- {
- int timeout=0;
- do
- {
- timeout++;
- if(gReceiveFlag == 1)
- {
- if(strstr((char *)gReceiveBuffer,"+PBREADY")>0)
- {
- //說(shuō)明收到+PBREADY,退出
- gReceiveFlag = 0;
- gReceiveBufferLen = 0;
- memset(gReceiveBuffer,0,GPRSBUFFERLEN);
- break;
- }
- Gprs_Delayms(200);
- }
- }while(timeout<10);
- if(timeout>=10)
- {
- //報(bào)錯(cuò)
- return false;
- }
- return true;
- }
- /*****************************************************
- *函數(shù)名稱:Gprs_CheckCCID(void)
- *函數(shù)描述:檢查SIM卡標(biāo)識(shí)信息
- *AT指令:“AT+CCID\r"
- *入口參數(shù):無(wú)
- *出口參數(shù):返回一個(gè)bool值
- *****************************************************/
- bool Gprs_CheckCCID(void)
- {
- int timeout=0; //超時(shí)次數(shù)變量
- do
- {
- timeout++;
- Gprs_SendATCommand("AT+CCID\r",8);
- //通過(guò)串口發(fā)送AT+CCID回車,獲取SIM卡標(biāo)識(shí)
- Gprs_Delayms(200); //延時(shí)200ms
- if(gReceiveFlag == 1)
- {
- //判斷接受緩沖區(qū)是否有數(shù)據(jù)
- if(strstr((char *)gReceiveBuffer,"ERROR")==0)
- {
- //查找完全匹配的子字符串,說(shuō)明返回值不是ERROR,表示讀取sim卡的CCID成功,退出
- gReceiveFlag = 0;
- gReceiveBufferLen = 0;
- memset(gReceiveBuffer,0,GPRSBUFFERLEN);
- break;
- }
- }
- }while(timeout<10);
- if(timeout>10)
- {
- //報(bào)錯(cuò)
- return false;
- }
- return true;
- }
- /***************************************************************************************
- *函數(shù)名稱:Gprs_CheckAT(void)
- *函數(shù)描述:檢查串口是否通,收到OK,則說(shuō)明串口已接通
- *AT指令:“AT\r"
- *入口參數(shù):無(wú)
- *出口參數(shù):返回一個(gè)bool值
- ****************************************************************************************/
- bool Gprs_CheckAT(void)
- {
- int timeout=0;
- // char str[35];
- do
- {
- timeout++;
- Gprs_SendATCommand("AT\r",3); //通過(guò)串口發(fā)送AT回車
- Gprs_Delayms(100);
- if(gReceiveFlag == 1)
- {
- //UART0_snd((unsigned char *)gReceiveBuffer,gReceiveBufferLen);
- if(strstr((char *)gReceiveBuffer,"OK")>0)
- {
- //說(shuō)明串口通,退出
- gReceiveFlag = 0;
- gReceiveBufferLen = 0;
- memset(gReceiveBuffer,0,GPRSBUFFERLEN);
- break;
- }
- }
- }while(timeout<10);
- if(timeout>=10)
- {
- //報(bào)錯(cuò)
- // test+=100;
- // sprintf(str,"%d",test);
- // UART0_snd(str,sizeof(str));
- // UART1_init(60000000, test);
- return false;
- }
- return true;
- }
- /***************************************************************************************
- *函數(shù)名稱:Gprs_CheckCSQ(void)
- *函數(shù)描述:檢查信號(hào)強(qiáng)度,回顯值:+CSQ:<rssi>,<ber>,其中rssi為查詢接受信號(hào)
- 強(qiáng)度,值在0~31之間,值越大表示強(qiáng)度越強(qiáng),若為99,則說(shuō)明未知或不可檢測(cè);ber為信道
- 位錯(cuò)誤率,值在0~7,若為99,則說(shuō)明未知或不可檢測(cè)
- *AT指令:“AT+CSQ\r"
- *入口參數(shù):無(wú)
- *出口參數(shù):返回一個(gè)bool值
- ****************************************************************************************/
- bool Gprs_CheckCSQ(void)
- {
- char *buf;
-
- int timeout=0;
- do
- {
- timeout++;
- Gprs_SendATCommand("AT+CSQ\r",7); //檢查信號(hào)強(qiáng)度
- Gprs_Delayms(100);
- if(gReceiveFlag == 1)
- {
- if(strstr(gReceiveBuffer,"+CSQ: 99,99")==0)
- {
- //說(shuō)明檢查的不是99,99,有信號(hào),退出
- 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ò)注冊(cè)狀態(tài),只有當(dāng)回顯值為0,1或0,5時(shí),才表示網(wǎng)絡(luò)注冊(cè)成功
- *AT指令:"AT+CREG?\r"
- *入口參數(shù):無(wú)
- *出口參數(shù):返回一個(gè)bool值
- ****************************************************************************************/
- bool Gprs_CheckCREG(void)
- {
- int timeout; // 超時(shí)次數(shù)變量;
- timeout = 0;
- do
- {
- timeout++;
- Gprs_SendATCommand("AT+CREG?\r",9);
- // 通過(guò)串口發(fā)送AT+CREG?回車,查詢模塊的當(dāng)前網(wǎng)絡(luò)注冊(cè)狀態(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ò)注冊(cè)成功
- gReceiveFlag =0;
- gReceiveBufferLen = 0;
- memset(gReceiveBuffer,0,GPRSBUFFERLEN);
- break;
- }
- }
- }while(timeout<10);
- if( timeout>=10 )
- {
- // 報(bào)錯(cuò);說(shuō)明網(wǎng)絡(luò)注冊(cè)失敗!
- return false;
- }
- return true;
- }
- /***************************************************************************************
- *函數(shù)名稱:Gprs_SetStack(void)
- *函數(shù)描述:設(shè)置
- *AT指令:"AT+CREG?\r"
- *入口參數(shù):無(wú)
- *出口參數(shù):返回一個(gè)bool值
- ****************************************************************************************/
- bool Gprs_SetStack(void)
- {
- int timeout; // 超時(shí)次數(shù)變量;
- timeout = 0;
- do
- {
- timeout++;
- Gprs_SendATCommand("AT+_XISP=0\r",10); //使用內(nèi)部協(xié)議棧
- // 通過(guò)串口發(fā)送AT+CREG?回車,查詢模塊的當(dāng)前網(wǎng)絡(luò)注冊(cè)狀態(tài)
- Gprs_Delayms(100);
- if(gReceiveFlag == 1)
- {
- if( strstr((char *)gReceiveBuffer,"OK")>0 )
- {
- // 如果返回值為+CREG: 0,1或+CREG: 0,5,則網(wǎng)絡(luò)注冊(cè)成功
- gReceiveFlag =0;
- gReceiveBufferLen = 0;
- memset(gReceiveBuffer,0,GPRSBUFFERLEN);
- break;
- }
- }
- }while(timeout<10);
- if( timeout>=10 )
- {
- // 報(bào)錯(cuò);說(shuō)明網(wǎng)絡(luò)注冊(cè)失敗!
- return false;
- }
- return true;
- }
- /***************************************************************************************
- *函數(shù)名稱:Gprs_CheckPPPLink(void)
- *函數(shù)描述:建立PPP鏈接,
- *AT指令:”AT+XIIC=1\r“
- *入口參數(shù):無(wú)
- *出口參數(shù):返回一個(gè)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)注冊(cè)上網(wǎng)絡(luò)。可使用
- AT+CREG?來(lái)判斷,如果返回+CREG:0,1或+CREG:0,5,都表明已注冊(cè)上網(wǎng)絡(luò)。
- ****************************************************************************************/
- bool Gprs_CreatePPPLink(void)
- {
- int timeout; // 超時(shí)次數(shù)變量;
- timeout = 0;
- do
- {
- timeout++;
- Gprs_SendATCommand("AT+XIIC=1\r",10); //要求建立PPP連接
- Gprs_Delayms(100); // 延時(shí)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 )
- {
- // 報(bào)錯(cuò);說(shuō)明PPP建立失敗!
- return false;
- }
- return true;
- }
- /***************************************************************************************
- *函數(shù)名稱:Gprs_CheckPPPStatus(void)
- *函數(shù)描述:查詢PPP鏈路狀態(tài)
- *AT指令:"AT+XIIC=?\r"
- *入口參數(shù):無(wú)
- *出口參數(shù):返回一個(gè)bool值
- ****************************************************************************************/
- bool Gprs_CheckPPPStatus(void)
- {
- int value=0; // 超時(shí)次數(shù)變量;
- char *pstr1,*pstr2;
- do
- {
- value++;
- Gprs_SendATCommand("AT+XIIC?\r",9);
- //發(fā)送AT+XIIC=?查詢鏈路狀態(tài)
- Gprs_Delayms(500); // 延時(shí)500ms;
- if(gReceiveFlag == 1)
- {
- if( strstr((char *)gReceiveBuffer,"+XIIC: 1")>0 )
- // if(strstr((char *)gReceiveBuffer,"OK")>0)
- {
- //判斷返回值 如果返回+XIIC: 1, *.*.*.*,則跳出循環(huán),1前面有4個(gè)空格
- //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 )
- {
- // 報(bào)錯(cuò);說(shuō)明PPP建立失敗!
- return false;
- }
- return true;
- }
- bool Search_IP(void)
- {
- char buffer[50];
- unsigned char i,len;
- char *pstr1,*pstr2;
- int value=0; // 超時(shí)次數(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); // 延時(shí)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個(gè)空格
- 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();// 報(bào)錯(cuò);說(shuō)明PPP建立失敗!
- return false;
- }
- return true;
- }
- /********************************************************************************
- *函數(shù)名稱:Gprs_CreateTCPLink(unsigned char *linkStr,int size)
- *函數(shù)功能:建立TCP鏈接
- *AT指令:AT+TCPSETUP=<n>,<ip>,<port>
- 其中n為鏈路編號(hào)0和1;ip為目的IP地址,必須是形如XX.XX.XX.XX的輸入;
- port為目的端口號(hào),必須是十進(jìn)制的ASCII碼
- *入口參數(shù):所需發(fā)送的TCP指令 AT+TCPSETUP=<n>,<ip>,<port>,即包括所有信息的字符串
- *出口參數(shù):返回一個(gè)bool值
- **********************************************************************************/
- bool Gprs_CreateTCPLink(char *linkStr,int size)
- {
- int timeout; // 超時(shí)次數(shù)變量;
- if( size<=0 )
- return false;
- timeout = 0;
- Gprs_SendATCommand(linkStr,size);//發(fā)送AT指令建立TCP連接
- Gprs_Delayms(500); // 延時(shí)500ms;
- do
- {
- timeout++;
- Gprs_Delayms(100); // 延時(shí)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 )
- {
- // 報(bào)錯(cuò);說(shuō)明TCP鏈接失敗!
- return false;
- }
- return true;
- }
- bool Gprs_CreateUDPLink(char *linkStr,int size)
- {
- int timeout; // 超時(shí)次數(shù)變量;
- if( size<=0 )
- return false;
- timeout = 0;
- Gprs_SendATCommand(linkStr,size);//發(fā)送AT指令建立TCP連接
- Gprs_Delayms(500); // 延時(shí)500ms;
- do
- {
- timeout++;
- Gprs_Delayms(100); // 延時(shí)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 )
- {
- // 報(bào)錯(cuò);說(shuō)明UDP鏈接失敗!
- return false;
- }
- return true;
- }
- /***************************************************************************************
- *函數(shù)名稱:Gprs_CloseTCPLink(void)
- *函數(shù)描述:關(guān)閉TCP鏈路
- *AT指令:AT+TCPCLOSE=<n> 其中的n為鏈路號(hào)
- *入口參數(shù):無(wú)
- *出口參數(shù):返回一個(gè)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ā)送完畢后,會(huì)接收到大于號(hào)">",這時(shí)候請(qǐng)延遲50ms~100ms,
- 然后發(fā)送數(shù)據(jù)
- *AT指令:AT+TCPSEND=<n>,<length> 其中n為鏈路編號(hào) length為要發(fā)送的數(shù)據(jù)長(zhǎng)度,以字節(jié)為單位
- 取值范圍1~200
- *入口參數(shù):無(wú)
- *出口參數(shù):返回一個(gè)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 )
- {
- // 報(bào)錯(cuò);說(shuō)明鏈路沒(méi)有建立;
- #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 )
- {
- // 報(bào)錯(cuò);說(shuō)明TCP鏈接失敗!
- return false;
- }
- // 如果TCP狀態(tài)OK 則開(kāi)始發(fā)送TCP指令;
- if(size<10)
- {
- sprintf(sendtemp,"AT+TCPSEND=0,%1d\r",size);
- Gprs_SendATCommand(sendtemp,15); //發(fā)送 AT+TCPSEND=0,size回車,發(fā)送size個(gè)字節(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個(gè)字節(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個(gè)字節(jié);
- }
- else if(size>=1000)
- {
- sprintf(sendtemp,"AT+TCPSEND=0,%4d\r",size);
- Gprs_SendATCommand(sendtemp,18);
- }
- // 判斷接收發(fā)送符:">"
- do
- {
- timeout++;
- Gprs_Delayms(150); // 延時(shí)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 )
- {
- // 報(bào)錯(cuò);說(shuō)明沒(méi)有收到 >,不能發(fā)送數(shù)據(jù)!
- return false;
- }
- memcpy(gSendBuffer,databuf,size);
- // 開(kāi)始發(fā)送數(shù)據(jù);發(fā)送數(shù)據(jù)時(shí),必須在數(shù)據(jù)包的末尾加上0x0d 作為結(jié)束符,但該結(jié)束符不算到數(shù)據(jù)長(zhǎng)度里,
- gSendBuffer[size+1] = 0x0D;
- UART1_snd(gSendBuffer,size+1); //發(fā)送size個(gè)字節(jié)數(shù)據(jù)和回車;記住數(shù)據(jù)最后要加回車符;
- Gprs_Delayms(200); // 延時(shí)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 )
- {
- // 報(bào)錯(cuò);說(shuō)明鏈路沒(méi)有建立;
- #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 )
- {
- // 報(bào)錯(cuò);說(shuō)明TCP鏈接失敗!
- return false;
- }
- // 如果TCP狀態(tài)OK 則開(kāi)始發(fā)送TCP指令;
- if(size<10)
- {
- sprintf(sendtemp,"AT+UDPSEND=1,%1d\r",size);
- Gprs_SendATCommand(sendtemp,15); //發(fā)送 AT+TCPSEND=0,size回車,發(fā)送size個(gè)字節(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個(gè)字節(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個(gè)字節(jié);
- }
- else if(size>=1000)
- {
- sprintf(sendtemp,"AT+UDPSEND=1,%4d\r",size);
- Gprs_SendATCommand(sendtemp,18);
- }
- // 判斷接收發(fā)送符:">"
- do
- {
- timeout++;
- Gprs_Delayms(150); // 延時(shí)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 )
- {
- // 報(bào)錯(cuò);說(shuō)明沒(méi)有收到 >,不能發(fā)送數(shù)據(jù)!
- return false;
- }
- memcpy(gSendBuffer,databuf,size);
- // 開(kāi)始發(fā)送數(shù)據(jù);發(fā)送數(shù)據(jù)時(shí),必須在數(shù)據(jù)包的末尾加上0x0d 作為結(jié)束符,但該結(jié)束符不算到數(shù)據(jù)長(zhǎng)度里,
- gSendBuffer[size+1] = 0x0D;
- UART1_snd(gSendBuffer,size+1); //發(fā)送size個(gè)字節(jié)數(shù)據(jù)和回車;記住數(shù)據(jù)最后要加回車符;
- Gprs_Delayms(200); // 延時(shí)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ù):無(wú)
- *出口參數(shù):返回一個(gè)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
- // 解析后面的長(zhǎng)度和數(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
- // 解析后面的長(zhǎng)度和數(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ù):無(wú)
- *出口參數(shù):返回一個(gè)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ā)送字符串,及長(zhǎng)度
- *出口參數(shù):返回一個(gè)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ù):接收到的字符串及長(zhǎng)度
- // *出口參數(shù):無(wú)
- // ****************************************************************************************/
- //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
- // {
- ……………………
- …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼
所有資料51hei提供下載:
7213-Modbus.zip
(921.66 KB, 下載次數(shù): 20)
2018-10-6 15:52 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
|
|