http://www.cnblogs.com/yangfengwu/p/8871464.html
先把源碼和資料鏈接放到這里
源碼鏈接:https://pan.baidu.com/s/1wT8KAOIzvkOXXNpkDI7E8g
提取碼:1q9y
前幾篇是介紹的模塊建立TCP服務器,不連接路由器,然后進行通信呢,連接路由器最大的好處就是可以實現遠程控制
今天呢有喜有悲,悲喜交加,板子終於開始貼片了....
今天最讓人開心的事情是自己剛做的GPRS的板子和51學習的板子雖然自己馬虎畫錯了一個地方起初也不知道...,但是嘉立創的客服今天打電話說自己那個地方有點問題,然后給自己修改了過來,,,現在感覺在嘉立創做板子就是放心,真的.不是打廣告哈,感覺人家的服務就是好
現在看一下自己畫的不對的地方
現在只看機械層和底層
直接一個打孔就干掉了這條線..................機械層在畫板子的時候如果不注意........下次一定要時刻提醒着自己,畫完板子單獨看一下機械層和頂層或底層,容易忘
現在接着說
其實連接路由器就一條指令
其實應該還有配置設置自己的IP地址固定住,一會在說,咱先連接路由器,然后開啟TCP,然后看一下模塊的IP,然后進行通信
剛才測試發現一個問題,如果配置了連接無線了(而且保存了),那么上電后模塊
那么咱們以前的程序就不能用了,,,不能是等待3s后判斷有沒有ready,,,,應該是復位以后一直檢測有沒有回復ready,超過3S沒有回復就再發送一次指令,發送的指令超過3次
那么咱就重新開始
看一個就行,,,下面的都一樣
/*下面的都是一樣的模子,注釋就寫一個*/ Cnt = 0; CntCnt = 0; SendDataFlage = 1; while(1) { if(SendDataFlage == 1)//發送指令 { SendDataFlage = 0; printf("8266RST\r\n");//這個不是什么指令,我先用串口調試助手模擬 P0_0 = 1;//這個燈作為指示燈,發送個指令就亮, ESP_Rst();//復位8266 } DelayMs(1); if(UsartFlage == 1)//串口接收到數據 { UsartFlage = 0; if(strstr(UsartReceive, "ready"))//有沒有ready { P0_0 = 0;//接收到正確的回復就滅 DelayMs(500); break; } } Cnt ++; if(Cnt>=3000)//每間隔3S發送一次數據 { SendDataFlage = 1;//允許發送數據 Cnt = 0; CntCnt++; } if(CntCnt>=3)//超過三次重新開始 { CntCnt = 0; Cnt = 0; goto start; } }
所以現在的程序
#define MAIN_C_ #include "include.h" /** * 介紹: 主函數 * 說明: 每間隔1S發送一次溫濕度數據 * 說明: 返回串口接收到的數據,發送方式為中斷發送 * 說明: None * 說明: None * 支持: QQ946029359 --群 607064330 * 淘寶: https://shop411638453.taobao.com/ * 作者: 小五 **/ int Cnt = 0; unsigned char CntCnt = 0; unsigned char SendDataFlage = 0; unsigned char ConnectID = 0; unsigned char i=0; unsigned char SendDataValue[6]={0xaa,0x55}; int ReadDHT11delay = 0;//設置多少時間讀一次DHT11; void main() { InitUART(115200); InitTimer0(); start: /*下面的都是一樣的模子,注釋就寫一個*/ Cnt = 0; CntCnt = 0; SendDataFlage = 1; while(1) { if(SendDataFlage == 1)//發送指令 { SendDataFlage = 0; printf("8266RST\r\n");//這個不是什么指令,我先用串口調試助手模擬 P0_0 = 1;//這個燈作為指示燈,發送個指令就亮, ESP_Rst();//復位8266 } DelayMs(1); if(UsartFlage == 1)//串口接收到數據 { UsartFlage = 0; if(strstr(UsartReceive, "ready"))//有沒有ready { P0_0 = 0;//接收到正確的回復就滅 DelayMs(500); break; } } Cnt ++; if(Cnt>=3000)//每間隔3S發送一次數據 { SendDataFlage = 1;//允許發送數據 Cnt = 0; CntCnt++; } if(CntCnt>=3)//超過三次重新開始 { CntCnt = 0; Cnt = 0; goto start; } } /*配置連接路由器*/ Cnt = 0; CntCnt = 0; SendDataFlage = 1; while(1) { if(SendDataFlage) { SendDataFlage = 0; printf("AT+CWJAP_DEF=\"qqqqq\",\"11223344\"\r\n");//連接路由器 P0_0 = 1; } DelayMs(1); if(UsartFlage == 1) { UsartFlage = 0; if(strstr(UsartReceive, "OK")) { P0_0 = 0; DelayMs(500); break; } } Cnt ++; if(Cnt>=3000)//每間隔3S發送一次數據 { SendDataFlage = 1;//允許發送數據 Cnt = 0; CntCnt++; } if(CntCnt>=3)//超過三次重新開始 { CntCnt = 0; Cnt = 0; goto start; } } /*配置模式*/ Cnt = 0; CntCnt = 0; SendDataFlage = 1; while(1) { if(SendDataFlage) { SendDataFlage = 0; printf("AT+CWMODE_DEF=3\r\n");//AP+Station P0_0 = 1; } DelayMs(1); if(UsartFlage == 1) { UsartFlage = 0; if(strstr(UsartReceive, "OK")) { P0_0 = 0; DelayMs(500); break; } } Cnt ++; if(Cnt>=3000)//每間隔3S發送一次數據 { SendDataFlage = 1;//允許發送數據 Cnt = 0; CntCnt++; } if(CntCnt>=3)//超過三次重新開始 { CntCnt = 0; Cnt = 0; goto start; } } /*多連接*/ Cnt = 0; CntCnt = 0; SendDataFlage = 1; while(1) { if(SendDataFlage) { SendDataFlage = 0; printf("AT+CIPMUX=1\r\n");//啟動多連接 P0_0 = 1; } DelayMs(1); if(UsartFlage == 1) { UsartFlage = 0; if(strstr(UsartReceive, "OK")) { P0_0 = 0; DelayMs(500); break; } } Cnt ++; if(Cnt>=3000)//每間隔3S發送一次數據 { SendDataFlage = 1;//允許發送數據 Cnt = 0; CntCnt++; } if(CntCnt>=3)//超過三次重新開始 { CntCnt = 0; Cnt = 0; goto start; } } /*創建服務器*/ Cnt = 0; CntCnt = 0; SendDataFlage = 1; while(1) { if(SendDataFlage) { SendDataFlage = 0; printf("AT+CIPSERVER=1,1001\r\n");//創建服務器 P0_0 = 1; } DelayMs(1); if(UsartFlage == 1) { UsartFlage = 0; if(strstr(UsartReceive, "OK")) { P0_0 = 0; DelayMs(500); break; } } Cnt ++; if(Cnt>=3000)//每間隔3S發送一次數據 { SendDataFlage = 1;//允許發送數據 Cnt = 0; CntCnt++; } if(CntCnt>=3)//超過三次重新開始 { CntCnt = 0; Cnt = 0; goto start; } } /*讓小燈閃一閃,算是說明正確執行了把*/ P0_0 = 0; DelayMs(200); P0_0 = 1; DelayMs(200); P0_0 = 0; DelayMs(200); P0_0 = 1; DelayMs(200); P0_0 = 0; while(1) { if(TimeCnt>=200) { TimeCnt = 0; DHT11_Receive(); } if(UsartFlage == 1)//返回接收的數據 { UsartFlage = 0; for(i=0;i<10;i++)//找到開始的數據位置,有的固件數據前頭有換行,有的沒有 { if(UsartReceive[i]=='+' && UsartReceive[i+1]=='I'&& UsartReceive[i+2]=='P')//判斷數據的頭 { ConnectID = UsartReceive[i+5];//得到是幾號連接的 if(ConnectID>=0x30 && ConnectID<=0x34)//得到的ID號有沒有越界 { for(i=6;i<15;i++)//找到 : 在哪里,才知道真實數據在哪里 { if(UsartReceive[i] == ':') { if(UsartReceive[i+1]==0xaa && UsartReceive[i+2]==0x55) { switch(UsartReceive[i+3]) { case 0x01: SendDataValue[2] = 0x01; SendDataValue[3] = DHT11Data[0]; SendDataValue[4] = DHT11Data[2]; ESPSendData(ConnectID-0x30,5,SendDataValue,1000); break;//發送溫濕度數據 case 0x02: if(UsartReceive[i+4] == 0x00) { P0_0 = 0; } else if(UsartReceive[i+4] == 0xff) { P0_0 = 1; } break; default:break; } break;//結束for(i=6;i<15) } } } break;//結束for(i=0;i<10;i++) } } } } } }
多加了一個指令(在復位后執行)
對了\" 在前面介紹了哈 就是代表"
程序下進去了,現在看一下自己的路由器列表
現在測試通信
用咱做的TCP客戶端測試
既然連接路由器了,就可以實現遠程了
先用花生殼,,不知道還能不能用,花了6塊錢都買了一年了.....
詳細的購買花生殼過程,請參考我的這篇文章
http://www.cnblogs.com/yangfengwu/p/7736296.html#3941866
先映射
對了說一下,其實直接連接模塊的無線也是可以通信的....
現在測試C#TCP客戶端
現在用花生殼連接
看來是解析域名出了問題直接百度
咱試一試
可以啦.....
接着再修改一下單片機的程序,8266連接路由器之后是不是因為自動分配的IP,所以對於咱來說是不是不方便哈,如果IP地址變了,,,還要查看,然后花生殼還要跟着修改,,,
現在咱固定模塊的IP
兩種方式一種是用模塊的指令,另一種是在路由器里面修改
咱先用指令修改
我先用串口助手配置一下看看回的內容
現在做單片機程序..其實就是加一個指令
/*配置連接路由器后分得的IP地址是多少*/ Cnt = 0; CntCnt = 0; SendDataFlage = 1; while(1) { if(SendDataFlage) { SendDataFlage = 0; printf("AT+CIPSTA_DEF=\"192.168.1.106\",\"192.168.1.1\",\"255.255.255.0\"\r\n"); P0_0 = 1; } DelayMs(1); if(UsartFlage == 1) { UsartFlage = 0; if(strstr(UsartReceive, "OK")) { P0_0 = 0; DelayMs(500); break; } } Cnt ++; if(Cnt>=3000)//每間隔3S發送一次數據 { SendDataFlage = 1;//允許發送數據 Cnt = 0; CntCnt++; } if(CntCnt>=3)//超過三次重新開始 { CntCnt = 0; Cnt = 0; goto start; } }
現在也設置一下花生殼
咱用手機遠程連接一下
現在用路由器修改
咱先把程序修改的屏蔽掉,
/*配置連接路由器后分得的IP地址是多少*/ // Cnt = 0; // CntCnt = 0; // SendDataFlage = 1; // while(1) // { // if(SendDataFlage) // { // SendDataFlage = 0; // printf("AT+CIPSTA_DEF=\"192.168.1.106\",\"192.168.1.1\",\"255.255.255.0\"\r\n"); // P0_0 = 1; // } // // DelayMs(1); // if(UsartFlage == 1) // { // UsartFlage = 0; // if(strstr(UsartReceive, "OK")) // { // P0_0 = 0; // DelayMs(500); // break; // } // } // // Cnt ++; // if(Cnt>=3000)//每間隔3S發送一次數據 // { // SendDataFlage = 1;//允許發送數據 // Cnt = 0; // CntCnt++; // } // if(CntCnt>=3)//超過三次重新開始 // { // CntCnt = 0; // Cnt = 0; // goto start; // } // }
噢噢噢噢噢噢噢知道原因了
可以先恢復出廠設置
不過模塊有問題了.................
哦哦哦哦哦知道原因了....要先設置模式默認AP模式是不可以連接路由器的................以前的程序全部有BUG...................
#define MAIN_C_ #include "include.h" /** * 介紹: 主函數 * 說明: 每間隔1S發送一次溫濕度數據 * 說明: 返回串口接收到的數據,發送方式為中斷發送 * 說明: None * 說明: None * 支持: QQ946029359 --群 607064330 * 淘寶: https://shop411638453.taobao.com/ * 作者: 小五 **/ int Cnt = 0; unsigned char CntCnt = 0; unsigned char SendDataFlage = 0; unsigned char ConnectID = 0; unsigned char i=0; unsigned char SendDataValue[6]={0xaa,0x55}; int ReadDHT11delay = 0;//設置多少時間讀一次DHT11; void main() { InitUART(115200); InitTimer0(); start: /*下面的都是一樣的模子,注釋就寫一個*/ Cnt = 0; CntCnt = 0; SendDataFlage = 1; while(1) { if(SendDataFlage == 1)//發送指令 { SendDataFlage = 0; printf("8266RST\r\n");//這個不是什么指令,我先用串口調試助手模擬 P0_0 = 1;//這個燈作為指示燈,發送個指令就亮, ESP_Rst();//復位8266 } DelayMs(1); if(UsartFlage == 1)//串口接收到數據 { UsartFlage = 0; if(strstr(UsartReceive, "ready"))//有沒有ready { P0_0 = 0;//接收到正確的回復就滅 DelayMs(500); break; } } Cnt ++; if(Cnt>=3000)//每間隔3S發送一次數據 { SendDataFlage = 1;//允許發送數據 Cnt = 0; CntCnt++; } if(CntCnt>=3)//超過三次重新開始 { CntCnt = 0; Cnt = 0; goto start; } } /*配置模式*/ Cnt = 0; CntCnt = 0; SendDataFlage = 1; while(1) { if(SendDataFlage) { SendDataFlage = 0; printf("AT+CWMODE_DEF=3\r\n");//AP+Station P0_0 = 1; } DelayMs(1); if(UsartFlage == 1) { UsartFlage = 0; if(strstr(UsartReceive, "OK")) { P0_0 = 0; DelayMs(500); break; } } Cnt ++; if(Cnt>=3000)//每間隔3S發送一次數據 { SendDataFlage = 1;//允許發送數據 Cnt = 0; CntCnt++; } if(CntCnt>=3)//超過三次重新開始 { CntCnt = 0; Cnt = 0; goto start; } } // /*配置連接路由器后分得的IP地址是多少*/ // Cnt = 0; // CntCnt = 0; // SendDataFlage = 1; // while(1) // { // if(SendDataFlage) // { // SendDataFlage = 0; // printf("AT+CIPSTA_DEF=\"192.168.1.106\",\"192.168.1.1\",\"255.255.255.0\"\r\n"); // P0_0 = 1; // } // // DelayMs(1); // if(UsartFlage == 1) // { // UsartFlage = 0; // if(strstr(UsartReceive, "OK")) // { // P0_0 = 0; // DelayMs(500); // break; // } // } // // Cnt ++; // if(Cnt>=3000)//每間隔3S發送一次數據 // { // SendDataFlage = 1;//允許發送數據 // Cnt = 0; // CntCnt++; // } // if(CntCnt>=3)//超過三次重新開始 // { // CntCnt = 0; // Cnt = 0; // goto start; // } // } /*配置連接路由器*/ Cnt = 0; CntCnt = 0; SendDataFlage = 1; while(1) { if(SendDataFlage) { SendDataFlage = 0; printf("AT+CWJAP_DEF=\"qqqqq\",\"11223344\"\r\n");//連接路由器 P0_0 = 1; } DelayMs(1); if(UsartFlage == 1) { UsartFlage = 0; if(strstr(UsartReceive, "OK")) { P0_0 = 0; DelayMs(500); break; } } Cnt ++; if(Cnt>=3000)//每間隔3S發送一次數據 { SendDataFlage = 1;//允許發送數據 Cnt = 0; CntCnt++; } if(CntCnt>=3)//超過三次重新開始 { CntCnt = 0; Cnt = 0; goto start; } } /*多連接*/ Cnt = 0; CntCnt = 0; SendDataFlage = 1; while(1) { if(SendDataFlage) { SendDataFlage = 0; printf("AT+CIPMUX=1\r\n");//啟動多連接 P0_0 = 1; } DelayMs(1); if(UsartFlage == 1) { UsartFlage = 0; if(strstr(UsartReceive, "OK")) { P0_0 = 0; DelayMs(500); break; } } Cnt ++; if(Cnt>=3000)//每間隔3S發送一次數據 { SendDataFlage = 1;//允許發送數據 Cnt = 0; CntCnt++; } if(CntCnt>=3)//超過三次重新開始 { CntCnt = 0; Cnt = 0; goto start; } } /*創建服務器*/ Cnt = 0; CntCnt = 0; SendDataFlage = 1; while(1) { if(SendDataFlage) { SendDataFlage = 0; printf("AT+CIPSERVER=1,1001\r\n");//創建服務器 P0_0 = 1; } DelayMs(1); if(UsartFlage == 1) { UsartFlage = 0; if(strstr(UsartReceive, "OK")) { P0_0 = 0; DelayMs(500); break; } } Cnt ++; if(Cnt>=3000)//每間隔3S發送一次數據 { SendDataFlage = 1;//允許發送數據 Cnt = 0; CntCnt++; } if(CntCnt>=3)//超過三次重新開始 { CntCnt = 0; Cnt = 0; goto start; } } /*讓小燈閃一閃,算是說明正確執行了把*/ P0_0 = 0; DelayMs(200); P0_0 = 1; DelayMs(200); P0_0 = 0; DelayMs(200); P0_0 = 1; DelayMs(200); P0_0 = 0; while(1) { if(TimeCnt>=200) { TimeCnt = 0; DHT11_Receive(); } if(UsartFlage == 1)//返回接收的數據 { UsartFlage = 0; for(i=0;i<10;i++)//找到開始的數據位置,有的固件數據前頭有換行,有的沒有 { if(UsartReceive[i]=='+' && UsartReceive[i+1]=='I'&& UsartReceive[i+2]=='P')//判斷數據的頭 { ConnectID = UsartReceive[i+5];//得到是幾號連接的 if(ConnectID>=0x30 && ConnectID<=0x34)//得到的ID號有沒有越界 { for(i=6;i<15;i++)//找到 : 在哪里,才知道真實數據在哪里 { if(UsartReceive[i] == ':') { if(UsartReceive[i+1]==0xaa && UsartReceive[i+2]==0x55) { switch(UsartReceive[i+3]) { case 0x01: SendDataValue[2] = 0x01; SendDataValue[3] = DHT11Data[0]; SendDataValue[4] = DHT11Data[2]; ESPSendData(ConnectID-0x30,5,SendDataValue,1000); break;//發送溫濕度數據 case 0x02: if(UsartReceive[i+4] == 0x00) { P0_0 = 0; } else if(UsartReceive[i+4] == 0xff) { P0_0 = 1; } break; default:break; } break;//結束for(i=6;i<15) } } } break;//結束for(i=0;i<10;i++) } } } } } }
花生殼剛才檢測原因關了,現在重新用花生殼映射
電腦端就不測試了,,,
其實這篇就改了一下單片機和C#的程序
今天...以前的源碼全有BUG.............唉
補充:
如果路由器不能上網,可以這樣
注意點:
路由器橋接手機的WIFI信號后,如果沒有注意到路由器分得的IP就登錄不進路由器了,因為我們登錄不進路由器,所以映射的時候怎么知道WIFI的IP地址,咱們可以設置WiFi固定住IP,但是網關和子網掩碼呢可以看電腦的
然后花生殼映射
另一個手機或者本機連接這個就可以
下一篇鏈接
https://www.cnblogs.com/yangfengwu/p/8970580.html
https://yq.aliyun.com/articles/585610