2016-11-16 92 views
2

我在使用Arduino,壓電傳感器和ESP8266進行有關座位佔用的項目。我的問題是我無法將數據發送到正在運行UDP服務器的PC上,使用Python編寫。無法通過ESP8266發送數據

我真正的問題是,我能夠發送數據,當我使用Arduino IDE的串行監視器。它完美地發送和接收數據,但代碼沒有運行,我無法指出我的錯誤。

的Arduino代碼:

const int seat_no = 2; 
const char *ssid = ""; 
const char *passwd = ""; 
const char *ip = "192.168.43.250"; 
const int port = 55056; 
const int threshold = 100; 

String op; 
int i, a, data_size; 
void setup() { 
    Serial.begin(9600); 
    Serial1.begin(115200); 
    Serial.println("Starting ESP8266"); 

    Serial1.write("AT+CWJAP=\""); 
    Serial1.write(ssid); 
    Serial1.write("\",\""); 
    Serial1.write(passwd); 
    Serial1.write("\"\r\n"); 
    Serial1.write("AT+CWMODE=1\r\n"); 
    Serial1.write("AT+CIPMUX=0\r\n"); 
    Serial1.write("AT+CIPSTART=\"UDP\",\""); 
    Serial1.write(ip); 
    Serial1.write("\","); 
    Serial1.write(port); 
    Serial1.write("\r\n"); 
} 
void loop() { 
    op = "{\"seat_status\":["; 
    for (i = 0; i < seat_no; i++) { 
    a = analogRead(i); 
    if (a > threshold) { 
     op += "\"0\""; 
     Serial.println("0"); 
    } 
    else { 
     op += "\"1\""; 
     Serial.println("1"); 
    } 
    if (i < seat_no - 1) 
     op += ","; 
    } 
    op += "]}"; 
    data_size = op.length(); 
    Serial1.write("AT+CIPSEND="); 
    Serial1.write(data_size+2); 
    Serial1.write("\r\n"); 
    delay(1000); 

    for (i = 0; i < data_size; i++) 
    Serial.write(op[i]); 
    Serial.println(); 

    for (i = 0; i < data_size; i++) 
    Serial1.write(op[i]); 
    Serial1.write("\r\n"); 
    delay(5000); 
} 

我想我的Python代碼是正確的,因爲我能夠接收來自其他來源的數據,以及(通過Android應用UDP發送者),所以幫我糾正這個問題。

電路圖 enter image description here

+0

嘗試交換RX/TX引腳,以便ESP的RX進入Mega的TX,反之亦然。 –

+0

這樣做沒有什麼來串行監視器。 ESP8266的Tx與Arduino的Tx相連,Rx相同 –

+0

我已經做了所有交換引腳的事情,使用其他的串行引腳,爲每個命令添加了延遲,而且它們都沒有解決我的問題。 –

回答

2

問題是與使用Serial1.write。這是一個較低級別的功能。它所做的只是發送字節,並不會將數字轉換爲其字符串表示形式。

當您將端口和數據長度寫入串行時,write函數僅發送一個帶有該值的字節而不是字符串。
如果您要將Serial1替換爲Serial並將命令發送回PC,您將看到該錯誤。

要真正解決您的問題,您應該用Serial1.print替換您所有的Serial1.write

+0

好澄清。它需要一個EOL char或println嗎? – cagdas

+0

他已經打印了他自己的'「\ r \ n」',但他可以用'Serial1.println()'替換它。 –

+0

@gre_gor將Serial.write更改爲Serial,print不顯示任何結果。我的問題依然存在。 –