Arduino Serial无法解析命令

时间:2018-02-17 23:01:31

标签: c++ arduino processing parseint

我使用Processing(java)通过串口与Arduino进行通信,Arduino控制着两个伺服器和一个激光器。一切都是独立工作的,但是当我使用Processing打开激光器时,我无法控制舵机,直到我关闭激光器。 疑难排解我试过了:

  1. 使用Arduino Serial或者手动向Arduino发送命令 Putty导致Arduino按预期工作(伺服控制是 独立于激光状态)
  2. 将Arduino置于串行桥配置中以监控什么 串行命令处理正在发送到Arduino,它就是 预期(运动位置,激光状态)
  3. 我使用的是外接电源,所以我知道它不是 最大当前抽奖问题。 (而且它有效。
  4. 处理中包含的延迟,刷新Arduino缓冲区。
  5. 全部使用“\ n”,“\ r”,“\ r \ n”组合。
  6. 这是我的处理程序:

    90,90\n 
    50,50\n
    -1\n
    

    它有一点可视化来监控电机位置,基本上只需发送“mot_x_pos,mot_y_pos \ n”和“-1 \ n”来切换激光器。 示例输出串行流:

    #include <Servo.h>
    bool laser = true; 
    // true sets the value high (off for my transistor)
    char val = 0;
    const int laser_pin = 7;
    int out1 = 9;    //servo pins
    int out2 = 11;
    boolean newData= true;
    Servo servo_x;  
    Servo servo_y;
    int pos_x =0;
    int pos_y =0;
    int x_prev = 90;
    int y_prev = 90;
    
    void setup() {
     Serial.begin(9600);
     Serial.println("<Arduino is ready>");
     servo_x.attach(out1);
     servo_y.attach(out2);
     pinMode(laser_pin, OUTPUT);
     digitalWrite(laser_pin, laser); //turn laser off on startup
    }
    
    void loop(){
      while(Serial.available()>0){
         pos_x = Serial.parseInt();
         pos_y = Serial.parseInt();
         val = Serial.read();  // this catches the newline escape characters
         if ( (pos_x<0) || (pos_y<0) ){
            //toggle laser
            if(laser){
               laser = false;
            }
            else {laser = true;}
            digitalWrite(laser_pin, laser);
         }
         else if( (val == '\n') || (val == '\r')  ){
              if(pos_x != x_prev){       //only write to the motors if something has changed
                  servo_x.write(pos_x);
                  x_prev = pos_x;
              }
              if(pos_y != y_prev){
                  servo_y.write(pos_y);   
                  y_prev = pos_y;
              } 
          }
       }
    }
    

    Arduino代码解析流并控制电机/激光器:

    {{1}}

    任何建议都将不胜感激,谢谢。

1 个答案:

答案 0 :(得分:1)

如果您提供的命令序列无效,将会有所帮助。

你的Arduino代码尝试读取两个int,但你只是用laser命令发送一个。那会不同步(parseInt并不关心行的结尾,它很乐意去下一行)

尝试

  1. 让你的激光按钮发送&#34; -1,-1和#34;所以所有行都有两个数字
  2. 更好的是,为您的线路创建一个结构更好的格式:首先写一个字母,说明它是伺服或激光命令,然后阅读所需的内容,然后确保找到一个&#39 ; \ n&#39;,然后重复。