私は、Epsonプロジェクターをシリアル回線で制御するためにesp 8266を使用しています。私はコンピュータとOSCを使用して、Epsonシリアルコマンドを実行するesp上の関数を呼び出しています。実装に問題があるというコマンドはズームです。プロジェクタは、それがいずれか:
又は:ERR
戻りコードを実行したらエプソンシリアルコマンドが1でレンズをズームする「クリック」シリアルコントロールとrsponseを待っています
ZOOM INC\r
あります。私の関数では、ユーザが何を入力したかに応じてコマンドを何度も実行することを想定しています。私の機能では、コマンドを再度実行する前にプロジェクターが応答するまで待つ必要があります。これが私が試したことです。
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