我正在使用esp 8266控制一台爱普生投影仪的串行线。我正在使用一台计算机和OSC来调用esp上运行Epson串行命令的函数。我在执行zoom时遇到了问题。单击1次即可缩放镜头的Epson串行命令为
ZOOM INC\r一旦投影仪执行代码,它就会返回一个:或:ERR。在我的函数中,假设根据用户输入的内容多次执行命令。在我的函数中,我想等待投影仪响应,然后再执行命令,这就是我一直在尝试的。
void zoom_inc(OSCMessage &msg){
OSCMessage qLab_msg("/cue/p0/name");
Serial.print("Zoom ");
lock = 1;
char cmd[10] = "ZOOM INC\r";
if(msg.getInt(0) < 0){
cmd[5] = 'D';
cmd[6] = 'E';
}
int high = (abs(msg.getInt(0)) > 50)? 50 : abs(msg.getInt(0));
Serial.print(cmd);
Serial.print(" ");
Serial.print(high);
Serial.println(" times");
unsigned long startTime;
unsigned long currentTime;
unsigned long diff;
boolean response = false;
String readString; //create response string
for(int i = 0; i < high; i++){
projSerial.write(cmd);
startTime = millis();
while(!response){
while (projSerial.available() > 0) { //look for projector response
Serial.write(projSerial.read());
delay(3);
char c = projSerial.read();
readString += c;
}
readString.trim(); //clean projector response
if(readString.length() == 1){
Serial.println("Read Data");
Serial.println(readString.length());
Serial.println(readString);
Serial.println("------------------------------------");
response = true;
}
currentTime = millis();
diff = currentTime - startTime;
if(diff >= 5000 || diff < 0){
Serial.println("Timeout");
response = true;
}
}
delay(200);
}
qLab_msg.add("Zoom Incremental");
Udp.beginPacket(qLabIP, qLabPort);
qLab_msg.send(Udp);
Udp.endPacket();
qLab_msg.empty();
}这是行不通的,因为它只做了它应该做的一半。例如,如果用户发送30,那么它只发送14
发布于 2017-02-25 08:24:21
这看起来很可疑:
Serial.write(projSerial.read());
delay(3);
char c = projSerial.read();
readString += c; 您刚刚从projSerial中读取了两个字符。一个回显到您的主串行端口,另一个将被添加到字符串中。从投影仪的响应中丢失大约所有其他字符似乎与只得到您预期的大约一半的步骤一致。
尝试:
char c = projSerial.read(); // read it just once
Serial.write(c);
readString += c;我假设delay(3)来自之前的猜测。
https://stackoverflow.com/questions/42450293
复制相似问题