日期:2014-05-18  浏览次数:21063 次

请教 C#多串口 实时通讯 读、写操作会相互干扰哦!
由于设计需要,我要让PC与其他几台设备经过串口实时通讯。我有几个串口服务器,所以可以认为我的PC有多个串口。
但是串口实时通讯有如下几个限制:

  1、工业现场的实时性监控要求:
  PC机要能够同时(宏观上)、周期性(假设一秒一次)地向多台设备发送读命令。但是这个读命令要先向设备写申请,收到设备的允许命令(比如“0xFF”)后,再发送确认命令才会有效。

  2、特殊情况下可改变设备运行状态要求:
  PC机要能够随时向某台设备发送写命令。但是这个写命令也要首先向设备写申请,收到设备的允许命令(比如还是“0xFF”)后,再发送确认命令才会有效。

  3、读、写操作会相互干扰:
  设备的送给PC机的写允许命令与读操作的读允许命令是相同的,所以PC机向设备的读操作和写操作应该是相互干扰的。因为,如果PC机正在执行某个读操作周期,设备刚向PC机发送“0xFF”,此时却触发了写操作,PC机向设备发送的是写申请的命令,设备仍然回复“0xFF”;由于读操作还未完成,所以PC机仍要发送读操作申请,那么系统可能一直处于申请状态,却不执行实际的读或者写操作。

  总结起来问题有以下几个特点:

  1:周期性触发对多个设备读操作(Timer?)
  2:随机性触发某个写操作 (ThreadPool?)
  3:读、写操作又相互干扰

  我刚学C#一个多月,所以高手们能否针对这个问题,给个流程控制的思路,并讲一讲大概如何实现。谢谢!

------解决方案--------------------
遇到类似的问题,关注下
------解决方案--------------------
你是应该知道你都连接了哪些设备,你也应该可以访问的到这些设备的串口,你该和谁握手,那应该不会混的,串口A接收事件肯定不会影响串口B的事件,而且你说应答式的,所以同一个串口读写是不会干扰的
------解决方案--------------------
如果PC机正在执行某个读操作周期,设备刚向PC机发送“0xFF”,此时却触发了写操作,PC机向设备发送的是写申请的命令,设备仍然回复“0xFF”;
---------------------------------------

那你串口操作应该是独占方式打开的,而不是共享方式
------解决方案--------------------
如果一个操作周期还未完成,又接受到了其他操作指令,你可以预先将操作指令存下来,等待前面一个完成之后再执行,或者就直接拒绝掉,让设备重新申请。
------解决方案--------------------
io口不就是得等待吗?多线程就是为了老等着io而设计的吧
------解决方案--------------------
这个问题不在串口也不在设备上,在于pc程序的线程处理上,你只需要将pc向设备发送的请求全部放入队列,由同一线程从队列取出后发送至设备就不会造成冲突。