2016-11-16 4 views
2

저는 Arduino, 압전 센서 및 ESP8266을 사용한 좌석 점유에 관한 프로젝트를 진행했습니다. 내 문제는 파이썬으로 작성된 UDP 서버가 실행중인 PC로 데이터를 보낼 수 없다는 것입니다.ESP8266을 통해 데이터를 전송할 수 없습니다.

내 진짜 문제는 Arduino IDE의 직렬 모니터를 사용할 때 데이터를 보낼 수 있다는 것입니다. 데이터를 완벽하게 보내고 받지만 코드가 실행되지 않고 실수를 지적 할 수 없습니다.

아두 이노 코드 :

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); 
} 

은 내가 (안드로이드 응용 프로그램 UDP를 보낸 사람을 통해)뿐만 아니라 다른 소스로부터 데이터를 수신 그래서이 문제를 해결하는 데 도움이 수 있어요으로 내 파이썬 코드가 정확한지 생각합니다.

회로도 enter image description here

+0

ESP의 RX가 메가의 TX가되도록 RX/TX 핀을 바꾸어보십시오. –

+0

는 아무 일도 직렬 모니터에 오지 않았다. ESP8266의 Tx는 arduino의 Tx와 연결하고 Rx의 경우 동일합니다. –

+0

모든 핀을 다른 핀으로 바꿔서 각 명령에 지연을 추가했으며 그 중 아무 것도 내 문제를 해결하지 못했습니다. –

답변

2

문제는 Serial1.write의 사용이다. 그것은 낮은 수준의 기능입니다. 그것은 바이트를 보내고 문자열 표현으로 숫자를 변환하지 않습니다.

직렬 포트에 데이터의 포트와 길이를 쓸 때 write 함수는 문자열이 아닌 해당 값을 가진 바이트를 보내고 있습니다.
Serial1Serial으로 바꾸고 명령을 PC로 다시 보내면 오류가 표시됩니다.

실제로 문제를 해결하려면 Serial1.write을 모두 Serial1.print으로 대체해야합니다.

+0

잘 정리되어 있습니다. EOL char 또는 println이 필요합니까? – cagdas

+0

그는 이미 자신의''\ r \ n "'을 인쇄하고 있지만,''Serial1.println()' '으로 대체 할 수 있습니다. –

+0

@gre_gor Serial.write를 Serial로 변경하면 인쇄 결과가 표시되지 않습니다. 내 문제가 계속된다. –