0

我有一个程序允许几个 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");
}

一些注意事项:

  • RtsEnableDtrEnable都处于活动状态
  • 波特率 (Arduino / C#) = 1200

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

4

2 回答 2

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);
}
于 2013-09-12T13:13:51.163 回答
0

您是否启用了正确的事件处理程序,就像在这个例子中一样?

mySerialPort.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);

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

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

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");
}
于 2013-09-12T10:53:35.547 回答