Serial port 处理-Serial.Write()发送不需要的字符';98';
我正在通过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'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。我一辈子都搞不清
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字符串的其余部分。