Serial port 处理-Serial.Write()发送不需要的字符';98';

Serial port 处理-Serial.Write()发送不需要的字符';98';,serial-port,arduino,processing,Serial Port,Arduino,Processing,我正在通过USB串行接口的处理草图控制arduino Uno。我在处理界面中有一个按钮,它运行precoat()方法,该方法调用一些其他方法并运行一些serial.write()命令。我认为所有相关代码如下。所有阀门最初都设置为false。当我调用precoat方法时,它应该在setPrecoat()中写入58,然后在setPumpSpeed()中写入9170。也许arduino看到一个字节串589170,但我可以处理任何一个。问题是,出于某种原因,它实际上写了58989170。我一辈子都搞不清

我正在通过USB串行接口的处理草图控制arduino Uno。我在处理界面中有一个按钮,它运行precoat()方法,该方法调用一些其他方法并运行一些serial.write()命令。我认为所有相关代码如下。所有阀门最初都设置为false。当我调用precoat方法时,它应该在setPrecoat()中写入58,然后在setPumpSpeed()中写入9170。也许arduino看到一个字节串589170,但我可以处理任何一个。问题是,出于某种原因,它实际上写了58989170。我一辈子都搞不清楚98是从哪里来的。如果我分别调用setPrecoat()方法和setPumpSpeed()方法,它们分别可以很好地编写58和9170。如果我将泵组从150调整为其他值,98仍会插入,9170也会相应改变。有没有想过为什么要写98?我能想到的唯一一件事是49*2是98,49是我添加到I中的东西,将其从int 0更改为char 1,但我看不出49如何将其转换为串行输出。特别是考虑到myPort.write(98)实际上会发送一个'b'而不是'98'

void precoat()
{
  autoCount = 0;
  timer = 0;
  setDataLogOn();  //no writing in this method so I didn't include it
  setPrecoat();
  pumpSet = 150;
  setPumpSpeed(pumpSet);
}

void setPrecoat()          
{
  //sets all modes false and then sets precoat mode to true.  Modes are used elsewhere.
  precoatMode = bodyFeedMode = waterRinseMode = airRinseMode = bodyFeedFillMode = precoatFillMode = precoatRinseMode = cleanMode = false;
  precoatMode = true;
  valvesRed();   //draws some red boxes
  stroke(BGPenR, BGPenG, BGPenB);                  //outline color for boxes matches BG
  fill(dataLogGreenR, dataLogGreenG, dataLogGreenB);  //sets color to green
  rect(0*27+370, 10, 22, 22);                             //draws one green box
  valveText();  //prints text on the boxes just drawn
  for (int i = 0;i<8;i++)       //valve state is a Boolean array which stores the state of each valve
  {
    if (i == 4 || i == 7)   //checks 5th and 8th array element.  If false, writes a 5 or 8 which sets them to true via the arduino
    {
      if (valveState[i]==false)
      {
        myPort.write(i+'1');     //edited for clarity i+'1' is more straight forward than i+49
      }
    }
    else
    {
      if (valveState[i] == true)  //checks other array element.  If true, writes their corresponding number which sets them to false via the arduino
      {
        myPort.write(i+'1');  //edited for clarity i+'1' is more straight forward than i+49

      }
    }
  }
}

void setPumpSpeed(int pump)  //sets the pump speed.  Writing 9 triggers a method on the arduino which accepts the next three chars as the input for a PWM pin.
{
  pumpRed();    //sets all pump boxes red
  fill(dataLogGreenR, dataLogGreenG, dataLogGreenB);
  stroke(BGPenR, BGPenG, BGPenB); 
  if (pump == 30)
  {
    //myPort.write("9031");
    myPort.write('9');
    myPort.write('0');
    myPort.write('3');
    myPort.write('1');
    rect((boxes)*27+370, 10, 35, 22);   //pump 30 box set to green
  } 
  else if (pump == 124)
  {
    //myPort.write("9136");
    myPort.write('9');
    myPort.write('1');
    myPort.write('3');
    myPort.write('6');    
    rect((boxes)*27+410, 10, 35, 22);    //pump 124 box set to green
  }
  else if (pump == 150)
  {
    //myPort.write("9170");
    myPort.write('9');
    myPort.write('1');
    myPort.write('7');
    myPort.write('0');    
    rect((boxes)*27+450, 10, 35, 22);  //pump 150 box set to green
  }
  else 
  {
    myPort.write("9000");
    //myPort.write('9');
    //myPort.write('0');
    //myPort.write('0');
    //myPort.write('0');    
    rect((boxes)*27+490, 10, 35, 22);  //pump 0 box set to green
  }
}
void预涂层()
{
自动计数=0;
定时器=0;
setDataLogOn();//此方法中没有写入内容,因此我没有包含它
setPrecoat();
泵组=150;
设置泵速(泵组);
}
void setPrecoat()
{
//将所有模式设置为false,然后将预涂模式设置为true。模式在其他位置使用。
precoatMode=bodyFeedMode=waterRinseMode=airRinseMode=bodyFeedFillMode=precoatFillMode=precoatRinseMode=cleanMode=false;
预编码模式=真;
valvesRed();//绘制一些红色框
笔划(BGPenR,BGPenG,BGPenB);//框的轮廓颜色与BG匹配
填充(dataLogGreenR、dataLogGreenG、dataLogGreenB);//将颜色设置为绿色
rect(0*27+370,10,22,22);//绘制一个绿色框
valveText();//在刚刚绘制的框上打印文本

对于(int i=0;i处理草图的代码是什么样子的?另外,最好发送
'1'+i
。更合理的是,我认为整个草图太大,无法在这里发布,但在一个螺壳中,有两个线程由serialEvent()和mouseClicked()驱动。arduino每秒发送一次数据字符串,该字符串由serialEvent()解析。该字符串包含诸如阀门状态、当前泵速和来自传感器的一些读数等信息。通过单击UI的各个部分,您可以调整阀门的位置。在有问题的情况下,我单击以设置“预涂层”除5号和8号阀门和泵速150外,所有阀门都关闭的模式。但它没有发送589170,而是发送58989170。你说得对,
'1'+i
更清晰。为了清晰起见,我会更改我的程序,但这似乎不能解决问题。我这样问是因为你发送的东西可能是正确的,但你阅读和阅读的方式可能是正确的tput可能会让你认为你不是arduino,我有一个串行的可用循环,它在字符进入时读取字符,并将其存储在字符数组中。如果它看到值1-8,则翻转相应的阀门。如果它看到值9,则需要接下来的三个字符将其转换为3位整数并设置泵速。然后每秒发送一次comma分离串行通信进行处理,以解析其中的泵速项目。因此,我可以从泵速设置为891的情况下看出,arduino接收到9891。然后阀7翻转,这是9170字符串的其余部分。