2017-02-25 10 views
1

Ich verwende einen esp 8266, um einen Epson Projektor über seine serielle Leitung zu steuern. Ich benutze einen Computer und OSC, um Funktionen auf dem ESP aufzurufen, die Epson serielle Befehle ausführen. Der Befehl, den ich nicht implementieren kann, ist Zoom. Der Epson Serial-Befehl, um die Linse in 1 „Klick“ zu vergrößern istSerielle Steuerung und Warten auf eine Antwort

ZOOM INC\r 

Sobald der Projektor den Code ausführt, es gibt entweder ein : oder :ERR. In meiner Funktion wird angenommen, dass der Befehl mehrere Male ausgeführt wird, abhängig davon, was der Benutzer eingibt. In meiner Funktion möchte ich warten, bis der Projektor reagiert, bevor ich den Befehl erneut ausführe, und das ist es, was ich versucht habe.

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

Dies funktioniert nicht, weil es nur etwa die Hälfte dessen, was es zu tun ist. Zum Beispiel, wenn der Benutzer 30 sendet es funktioniert nur 14

Antwort

2

Das sieht verdächtig:

Serial.write(projSerial.read()); 
delay(3); 
char c = projSerial.read(); 
readString += c; 

Sie haben gerade gelesen zwei Zeichen von projSerial. Der eine wird an den seriellen Hauptanschluss gesendet und der andere an die Zeichenfolge. Wenn Sie etwa alle anderen Zeichen aus der Antwort des Projektors verlieren, scheint das nur ungefähr die Hälfte der erwarteten Schritte zu sein.

Versuchen:

char c = projSerial.read(); // read it just once 
Serial.write(c); 
readString += c; 

Ich gehe davon aus den delay(3) aus einer früheren Vermutung war.

Verwandte Themen