Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
接收到.NET串行端口数据(开/关)_.net_Serial Port - Fatal编程技术网

接收到.NET串行端口数据(开/关)

接收到.NET串行端口数据(开/关),.net,serial-port,.net,Serial Port,我正在使用.NET4串行端口类和DataReceived处理程序 在DataReceive处理程序中,我从串行端口删除处理程序,处理数据,并在函数末尾重新添加处理程序 try { serial_port.datareceived -= new serialdatareceivedeventhandler(ondatareceived); // readline and process data } catch (exception ex) { } finally { serial_

我正在使用.NET4串行端口类和DataReceived处理程序

在DataReceive处理程序中,我从串行端口删除处理程序,处理数据,并在函数末尾重新添加处理程序

try
{
  serial_port.datareceived -= new serialdatareceivedeventhandler(ondatareceived);

  // readline and process data
}
catch (exception ex)
{
}
finally
{
  serial_port.datareceived += new serialdatareceivedeventhandler(ondatareceived);
}

这种用法的后果是什么(如果有的话)?它似乎工作得很好,尽管我没有长期测试它。我应该研究另一种方法吗?如果可能,请给出一个简单的代码示例/大纲。谢谢。

我个人不会删除每个DataReceived事件的处理程序,这是不必要的。如果您没有收到传入数据的通知,则始终有可能溢出现有缓冲区并丢失信息

我会使用类似于:

以上MSDN文章:

 private static void DataReceivedHandler( object sender, SerialDataReceivedEventArgs e)
 {
    SerialPort sp = (SerialPort)sender;
    string indata = sp.ReadExisting();
    Console.WriteLine("Data Received:");
    Console.Write(indata);
  }
关于本守则:

catch (exception ex)
{
}
永远,永远,永远,永远,永远,永远,永远,永远,永远,永远写这样的代码


这就像拆除孩子卧室中的烟雾探测器。

如果您担心重入,请使用
锁或互斥锁:

lock(lockobj)
{
    /*Read data from the port here.*/
}
取消订阅事件无法成功阻止重入,因为由于抢占式调度(与协作多线程或类似的方式相反),您的代码可能会在进入方法后(甚至在此之前)在您有机会取消订阅之前被抢占,并且会有更多数据到达,再次触发该机制

实际上,文档明确指出


你为什么这么做?为了避免再入?顺便说一句:你这样做可能会丢失一些数据……这让我想知道重返大气层是否真的是可能的,或者是被地球阻止的framework@yahia-是,以避免在处理接收到的数据时再次进入。数据丢失不是问题,因为设备是手动激活的,因此我从不丢失数据。@BoxerJoe删除侦听器并不能防止重入问题。如果可以重入,则在您着手删除处理程序之前,该事件可能会触发两次(或者,由于竞争条件或不一致的内部委托操作,甚至可能在您删除处理程序后触发)。我正在处理程序中插入数据库,不确定该事件是否可重入,此外,我正在处理的设备是手动激活的,因此我从不丢失数据。我只是不知道这样做是否有问题。当您连接和分离事件处理程序时,您的开销会增加。如果您不希望它是可重入的,我可能会从事件处理程序中取出所有繁重的工作,将传入的数据放入队列中,并让您的数据库例程监视队列中的数据。这是一个好主意。我确实需要立即向用户提供有关在数据库中成功记录事件的实时反馈。一个用户只能每15秒激活一次设备,但另一个用户可以在前一个用户之后立即启动设备。(顺便说一句,看起来你在做一些有趣的事情…那些是混凝土搅拌系统吗?)是的,我安装了混凝土搅拌系统,并编写了软件,使工厂保持完整。这显然不是实际的代码。。。你的答案应该放在评论中(或者最好是留给你自己,因为它听起来很粗鲁)。如果它不是实际的代码,为什么会在那里?我相信我的帖子很有帮助。这是什么样的回答?