2017-02-25 9 views
1

私は、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

答えて

2

行います

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

はあなただけprojSerialから文字を読みました。 1つはメインのシリアルポートにエコーされ、もう1つは文字列に追加されます。プロジェクターの応答から約1文字を失うことは、期待したステップの約半分しか得られないように見えます。

試してみてください。

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

私はdelay(3)は以前の推測からだったと仮定します。

関連する問題