1

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

我已经设法与 Arduino 建立联系并设置引脚值,但它并不总是想服从我的命令。我设置了几个复选框,当我选中一个框时,一个 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();
  }

我认为应用程序发送数据的速度超过了 Arduino 代码可以处理的速度,尤其是在这个循环中,但是我该怎么处理多余的数据呢?

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

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

4

1 回答 1

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();
    }
}
于 2013-10-05T01:32:07.200 回答