首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >串行控制和等待响应

串行控制和等待响应
EN

Stack Overflow用户
提问于 2017-02-25 08:01:37
回答 1查看 45关注 0票数 1

我正在使用esp 8266控制一台爱普生投影仪的串行线。我正在使用一台计算机和OSC来调用esp上运行Epson串行命令的函数。我在执行zoom时遇到了问题。单击1次即可缩放镜头的Epson串行命令为

代码语言:javascript
复制
 ZOOM INC\r

一旦投影仪执行代码,它就会返回一个::ERR。在我的函数中,假设根据用户输入的内容多次执行命令。在我的函数中,我想等待投影仪响应,然后再执行命令,这就是我一直在尝试的。

代码语言:javascript
复制
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

EN

回答 1

Stack Overflow用户

发布于 2017-02-25 08:24:21

这看起来很可疑:

代码语言:javascript
复制
Serial.write(projSerial.read());
delay(3);  
char c = projSerial.read();
readString += c; 

您刚刚从projSerial中读取了两个字符。一个回显到您的主串行端口,另一个将被添加到字符串中。从投影仪的响应中丢失大约所有其他字符似乎与只得到您预期的大约一半的步骤一致。

尝试:

代码语言:javascript
复制
char c = projSerial.read();  // read it just once
Serial.write(c);
readString += c;

我假设delay(3)来自之前的猜测。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42450293

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档