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