我正在尝试用 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 中的数组?
我已经指出了我的假设,并探索了替代方案,但找不到任何解决方案。你们对我有什么建议?