我有一个允许多个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");
}
一些注意事项:
波特率值是一个问题吗?我必须使用这个值,但我不确定它是否被C#接受。我也试过像this这样的东西但没有成功。
答案 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");
}