2017-02-25 106 views
1

我正在使用esp 8266来控制其串行线路上的Epson投影机。我正在使用计算机和OSC在运行Epson串行命令的esp上调用函数。我遇到麻烦的命令是缩放。爱普生串行命令放大1透镜“点击”是串行控制和等待响应

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

回答

2

这看起来可疑:

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)是从早期的猜测。