没有为每个事件调用c#SerialPort DataReceivedHandler。
我正在开发一个通过串口与Arduino交互的桌面应用程序。 我希望每次arduino在串行端口上写入内容时,我的应用程序都会做出响应。 但并非所有事件都会触发DataReceivedHandler。 这是连接代码-没有为每个事件调用c#SerialPort DataReceivedHandler。,c#,serial-port,C#,Serial Port,我正在开发一个通过串口与Arduino交互的桌面应用程序。 我希望每次arduino在串行端口上写入内容时,我的应用程序都会做出响应。 但并非所有事件都会触发DataReceivedHandler。 这是连接代码- public static bool connectToArduino() { foreach (string name in SerialPort.GetPortNames()) { SerialPort serialPort = new Seria
public static bool connectToArduino()
{
foreach (string name in SerialPort.GetPortNames())
{
SerialPort serialPort = new SerialPort(name);
Console.WriteLine(name);
if (serialPort.IsOpen == false)
{
serialPort.PortName = name;
try
{
Console.WriteLine("Openning serial port.");
serialPort.WriteTimeout = 5000;
serialPort.ReadTimeout = 5000;
serialPort.BaudRate = 115200;
serialPort.Open();
serialPort.Write(Constants.CONNECT_APP_STRING);
Console.WriteLine("Written to serial port.");
string reply = serialPort.ReadLine();
//string reply = serialPort.ReadTo("\n");
Console.WriteLine("Reply is: " + reply);
Console.WriteLine("Read from serial port.");
if (reply == Constants.CONNECT_ACK)
{
Console.WriteLine(name);
Console.WriteLine("Connected with arduino controller");
//serialPort.DataReceived += DataReceivedHandler;
serialController = serialPort;
return true;
}
else if (reply+"\n" == Constants.CONNECT_ARDUINO_STRING) {
serialPort.WriteLine(Constants.CONNECT_ACK);
serialController = serialPort;
MessageBox.Show("Connected with arduino controller");
return true;
}
else
{
serialPort.Close();
}
}
catch (TimeoutException)
{
Console.WriteLine("Timeout occured.");
serialPort.Close();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "ERROR");
Console.WriteLine(ex);
}
}
}
MessageBox.Show("Connection with Arduino failed!");
return false;
}
在此之后,我设置数据接收处理程序-
SerialComm.serialController.DataReceived += DataReceivedHandler;
现在的问题是,有时DataReceivedHandler没有被触发。
我找不到这种模式。它只是随机跳过一些事件。
知道出了什么问题吗 查看以下内容,您可以在备注中找到:
不能保证为接收到的每个字节引发DataReceived事件。使用BytesToRead属性确定缓冲区中还有多少数据需要读取
如果该事件在您的情况下太不可靠而不可信,那么您可以使用一个额外的线程在后台运行,不断检查属性和/或不断读取非阻塞的信息。此事件似乎不是最可靠的。如果你找的话,你可以找到很多关于它的文章。您输入数据的频率是多少?每秒?事件的频率非常不稳定,实际上这个应用程序是一个涉及激光的游戏控制器。因此,每当用户切断激光或按下按钮时,就会发生一个事件。那么,这个问题的解决方案是什么呢?如果我想要一种可靠的方式来获取所有事件,我应该使用什么来代替呢?我可以简单地将整个DataReceived处理程序移动到另一个线程吗?如果是,我会怎么做?另外,我如何确保线程没有被终止,因为我在应用程序日志中看到了很多“线程0x2764已退出,代码为0(0x0)”。DataReceived处理程序位于另一个线程上。该事件在另一个线程上触发。我的意思是在连接到设备后创建一个新任务,并让它运行,直到程序关闭或设备断开连接。除非您没有杀死任务/线程,并且它还没有完成它的工作,否则它将处于活动状态并正在执行它的工作:)