Dav*_*vio 5 c# multithreading serial-port
我有一个特殊的问题。
我需要用于与串行设备通信的自定义协议的工作方式如下,我使用的是标准ASCII缩写。
如果消息是要求答案的请求,则设备会发回数据。因为这种方式SerialPort.DataReceived有效,所以我必须手动将收到的消息拼凑在一起。它有点像这样:
基本上这就是这两种通信的方式,除非丢失数据包,NAK和其他东西,但我不想使其变得过于复杂。
我的问题是:如何将发送完整消息或接收完整消息包装到原子操作中?我不想要的是我的程序在将收到的消息粘在一起的同时正在发送新消息。
我尝试使用Monitor.Enter()和,Monitor.Exit()但是在另一个线程上调用了接收到的事件,因此没有骰子。
我还尝试使用Semaphore仅包含1个资源的a,semaphore.WaitOne()在semaphore.Release()发送EOT和从设备收到EOT之后,在发送或接收以及调用开始时进行调用。这也不是很好。
有什么办法可以更好地做到这一点?
我会使用锁:
http://msdn.microsoft.com/en-gb/library/c5kehkcz(v=vs.71).aspx
您可以设置一个全局对象(例如serialLock)并使用它来确保当您将各个部分粘合在一起时,任何发送线程都必须等待:
在收到的
lock(serialLock)
{
//Glue data
}
Run Code Online (Sandbox Code Playgroud)
总共发送:
lock(serialLock)
{
// send data
}
Run Code Online (Sandbox Code Playgroud)
这将对不同线程等的任何问题进行排序。
在释放锁之前,我还会确保您在粘合数据部分收到完整的消息。也许要清除此问题,您需要在 DataReceived 事件中更新线程安全的数据结构,并且在粘合数据部分中,您需要在释放锁之前检查数据结构中的完整消息。