我正在研究有关座椅占用的项目,其中我使用了Arduino,压电传感器和ESP8266。我的问题是我无法将数据发送到运行UDP服务器的PC上,用Python编写。
我真正的问题是,当我使用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发送者)接收数据,所以帮助我纠正这个问题。
答案 0 :(得分:2)
问题在于使用Serial1.write
。这是一个较低级别的功能。它只是发送字节,不会将数字转换为字符串表示。
当您将数据的端口和长度写入串行时,write
函数只是发送一个带有该值而不是字符串的字节。
如果您将Serial1
替换为Serial
并将命令发送回PC,您会看到错误。
要真正解决您的问题,您应该将所有Serial1.write
替换为Serial1.print
。