ESP-12F Arduino TCP Client
l
任務:
Tcp Client這個版本, 連到 我開啟的TcpServer, 我下指令, ESP 回傳測值
l 源由:
Tcp Client這個版本, 連到 我開啟的TcpServer, 我下指令, ESP 回傳測值
l 源由:
我要進行315Mhz 搖控器訊號波形實測,之前是用 cvi + 8051c 做的工具。
現在,想改版為 Python + Esp-01F Arduino 。
esp-01F 我要用 tcp server , 而 電腦 win7+python 做 TcpClient 做數據,波形分析。
但一時, 沒找到 arduino esp tcp server, 倒先找到 arduino esp tcp client,
那就先做 arduino esp tcp client 。做完, 再回來做 arduino esp server
l
執行細項:
甲、
client.print(s); 要送的是 String , 我的k 是char 陣列, 或者稱字串, 改為 String 再傳送。
tcp server 沒收到任何訊息,但com5 有。
乙、
先取消ex1(); , 並且 loop()
內, client.print("got it \r\n"); 多送幾次, 重燒, 看到底usr-tcp232
tcp server有沒有收到
1.
有收到, 很正常。
丙、
把傳送短訊息的, 放在
ex1(); 內, 進行實測
1.
沒有回應。=> 不行,就是不行。client.print() 只能在loop()中呼叫,不能在ex1()內呼叫。
丁、
再進行長字串的實測。=> client.print(s); => String
s; s再長都可以正常傳。
戊、
char *ex1(){}。loop 程式中, 傳送 client.print(s);
1.
有傳送, 但是, 全是亂碼。static char k[PMAX/8]; => 一切正常, pc tcp
server 有收到正確的上千字字串。
己、
問: ex1() 內, 到底能不能正常送出
字串, 透過 tcp
1.
結論是不行。
2.
經實測, 是不行的。ex1() 內呼叫 client.print("......") 並沒有動作。
3.
char *ex1(WiFiClient client) , 這樣看能不能正常。公共不用行, 就傳進函數。
甲、
還是不行。這表示, 只能在loop()
執行 client 的相關呼叫。
庚、
任務: 我就是要在ex1() 內傳送全部訊息。
1.
答: 不行, 就是不行, 結案。
辛、
任務: 取消 String s;
1.
不要 client.print(s); 而是 client.print(String(c));
甲、
燒第1次, 燒完成, 但執行時, tcp server 送出字串, 而 esp 沒正常送出, 在
COM5 視窗出現錯誤訊息。
乙、
再燒第2次, 若能有問題, 就代表, String s; 必須要使用。
i.
一直連不到網。
丙、
再燒第3次.
i.
連上網,連上tcp server.
tcp server 送字串給esp, esp 重置。
ii.
這証明, 不能簡化 String
s;
2.
回復原狀。
甲、
也是不行。最後, 把 char
k[PMAX+100]; 放在函數外,做公共變數, 才正常。
壬、
任務: 1次傳100字, 正常否.=> 正常。
1.
1次傳全部, 正常嗎? =>完全正常。
以下的程式碼是以
基于arduino ide for esp8266 实现tcp client
做為藍本,進行修改,
用 USR-TCP232-Test 來做為 COM5 , TCP Servier ,實測。
也有用 TCP&UDP測試工具 , 開一個 TCP Server 來測試,但這工具,不能發送 \r\n , 不太合用此範例程式。
/* 這是 tcp client, 先連到區域網路ap, 再連到已設定好的 tcp server
* 手機去告知 區網的密碼, 這支程式就能連上去。每次重置 esp, 都必須去手機設定, 很麻煩。
*/
#include
#define uc unsigned char
#define ui unsigned int
//#define LED 2 // 定位針腳 2 為 led 輸出, esp-01
#define LED 16 // 定位針腳 16 為 led 輸出, wsp-12f
const char *host = "192.168.1.102";//修改為你建立的Server服務端的IP位址
const int tcpPort = 8080;//修改為你建立的Server服務端的埠號
WiFiClient client;//創建一個用戶端實例
void smartConfig()
{
WiFi.mode(WIFI_STA);//設置esp的運行模式
Serial.println("\r\n Wait for Smartconfig");//服務端提示,可以清晰的知道晶片在做什麼
WiFi.beginSmartConfig();//庫自帶函數,此時通過手機進行wifi密碼設置
while (1){
Serial.println("\r\n Wait for phone to config.");//提示需要通過手機端設置
digitalWrite(LED, 0); delay(300);
digitalWrite(LED, 1); delay(300);
//閃爍燈光提示
if (WiFi.smartConfigDone())//如果完成配置,提示連接情況,此時手機也會收到提示
{
Serial.println("SmartConfig Success");
Serial.printf("SSID:%s\r\n", WiFi.SSID().c_str());
Serial.printf("PSW:%s\r\n", WiFi.psk().c_str());
break;
}
}
}
void setup()//晶片初始化
{
Serial.begin(115200);
Serial.println("Start module");
pinMode(LED, OUTPUT); digitalWrite(LED, 0);
smartConfig();
}
#define PMAX 100000
static char k[PMAX/8+1];
char *ex1()
{
ui i; for(i=0;i
void loop()
{
while (!client.connected())//當無法連接上伺服器時
{
if (!client.connect(host, tcpPort))//按指定的埠和位址鏈結到到指定的伺服器,如果鏈結不上
{
Serial.println("wait connection.to server ......");
digitalWrite(LED,1); delay(100);
digitalWrite(LED,0); delay(1000);
//1短燈光提示等待鏈結到伺服器,此時wifi已經鏈結上的
}
}
if(client.connected()) {Serial.printf("connection to %\r\n",host); }
while (client.connected())//當處於鏈結狀態 時
{
if (client.available())//如果緩衝區字串大於0
{
String line = client.readStringUntil('\r\n');//獲取字串
Serial.println(line);//把字串傳給串口
client.print("loop() : got it \r\n");//向伺服器回饋資訊
ex1(); String s; s=k; client.print(s);//必須在 loop() 內發送,且要 String sl
}
}
}
留言