C#-Arduino通讯不匹配?

时间:2013-10-05 01:03:12

标签: c# arduino

我正在尝试用C#编写一个程序,通过串行连接从我的计算机与我的Arduino UNO进行通信。目前我只是编写一个简单的应用程序,与Arduino建立联系,然后使用几个控件来控制arduino上的每个引脚;要么从中读取值,要么为其写入值。

我已经设法与Arduino建立联系并设置pin值,但它并不总是想遵守我的命令。我设置了几个复选框,当我选中一个方框时,LED应该打开,当我取消检查时它会关闭。问题是,有时LED只是保持开启或关闭状态,我必须在它再次响应之前单击该框几次,或重置我的电路......

我试图做一些故障查找,但无法找到问题的根源:它是我的应用程序还是Arduino代码?

以下是我的代码的相关部分:

private void sendValue(int RW, int _Pin, int Val) //send from my app to serial port
{
    if (CommPort.IsOpen)
    {
        CommPort.WriteLine(RW.ToString() + "," + _Pin.ToString() + ","  + Val.ToString());
    }
}

private void chP9_CheckedChanged(object sender, EventArgs e) //call the sendValue routine
{
    if (chP9.Checked)
    {
            sendValue(1, 9, 255); //('Write', to pin 9, 'On')
    }
    else
    {
        sendValue(1, 9, 0); //('Write', to pin 9, 'Off')
    }
}

这是我的C#代码,它编译一个以逗号分隔的字符串,通过串口发送,供Arduino读取。

这是Arduino代码:

int RW;    //0 to read pin, 1 to write to pin
int PN;    //Pin number to read or write
int Val;   //Value to write to pin

void setup() {
  Serial.begin(38400);
}

void loop() {
  ReadIncoming();
  ProcessIncoming(); 
}

void ReadIncoming()
{
  if(Serial.available() > 0)
  {
    RW = Serial.parseInt();
    PN = Serial.parseInt();
    Val = Serial.parseInt();
  }
  while(Serial.available() > 0) //Clear the buffer if any data remains after reading
  {
    Serial.read();
  }
}

void ProcessIncoming()
{
  if(RW == 0)
  {
    pinMode(PN, INPUT);
  }
  else
  {
    pinMode(PN, OUTPUT);
    analogWrite(PN, Val);
  }
}

parseInt只取出它找到的第一个整数值,存储它并丢弃逗号,并一次又一次地执行,但它似乎有点反直觉。

我认为我的问题在于:

  while(Serial.available() > 0) //Clear the buffer if any data remains after reading
  {
    Serial.read();
  }

我认为App发送数据的速度比Arduino代码可以处理的速度快,特别是在这个循环中,但是如何处理多余的数据呢?

我不喜欢使用parseInt,但这是我能够找到正确读取指令的唯一方法。如何从C#发送字节数组并将该数组读入Arduino中的数组?

我已经指出了我的假设,并探索了替代方案但无法得到任何解决方案。你们对我有什么建议?

1 个答案:

答案 0 :(得分:3)

我不清楚它为什么会起作用。你应该考虑一种更聪明的方法来编码命令。您只需要三个字节:

    private void sendValue(int RW, int _Pin, int Val) {
        var cmd = new byte[] { (byte)RW, (byte)_Pin, (byte)Val };
        ComPort.Write(cmd, 0, cmd.Length);
    }

然后你只需要在Arduino端读取这3个字节:

void ReadIncoming() {
    if (Serial.available() >= 3) {
        RW = Serial.read();
        PN = Serial.read();
        Val = Serial.read();
        ProcessIncoming();
    }
}