从Arduino / C#应用程序读取和发送串行数据

时间:2013-09-12 10:24:53

标签: c# winforms serial-port arduino

我有一个允许多个Arduinos通过串口进行通信的程序。例如,如果Arduino1想要与Arduino3通信,则用户从Arduino1发送一个字符串,此字符串出现在Arduino3上,依此类推。这适用于SerialMonitor

问题是当我尝试在我的C#应用​​程序中执行相同操作时(没有任何内容)。我试过这个:

//(...)
comPort1.Open();
//(...)
private void comPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
    string inData = comPort1.ReadLine();
    msgBoxLog.AppendText(inData); // msgBoxLog = textBox with data received/sent
}
//(...)
private void sendButton_Click(object sender, EventArgs e)
{
    string my_str = "my string";
    msgBoxLog.AppendText(my_str + "\r\n");
    comPort1.WriteLine(my_str + "\r\n");
}

一些注意事项:

  • RtsEnable DtrEnable 均有效
  • BaudRate(Arduino / C#)= 1200

波特率值是一个问题吗?我必须使用这个值,但我不确定它是否被C#接受。我也试过像this这样的东西但没有成功。

2 个答案:

答案 0 :(得分:1)

我有一个模糊的记忆,关于无法通过dataReceived事件访问UI控件。试试这个。

private void comPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
    string inData = comPort1.ReadLine();
    this.Invoke(new EventHandler(processData));
}

private void processData(object sender, EventArgs e)
{
    msgBoxLog.AppendText(inData);
}

答案 1 :(得分:0)

您是否启用了适当的事件处理程序,例如此示例?

mySerialPort.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);

http://msdn.microsoft.com/en-us/library/system.io.ports.serialport.datareceived.aspx

P.S。我在我的软件中,在写入和读取串行端口之间使用“哑”延迟,并且它工作正常。像这样:

serialPort1.Write(Data, 0, Data.Length);

System.Threading.Thread.Sleep(500);

try
{
    serialPort1.Read(Data2, 0, Data2.Length);
}
catch (TimeoutException)
{
    errorProvider1.SetError(maskedTextBox1, "timeout");
}
catch (ArgumentNullException)
{
    errorProvider1.SetError(maskedTextBox1, "no answer");
}