自己 up 下   System.Threading.ThreadPool.QueueUserWorkItem()是不是先放进去的请求先执行,如果是的话,跟我监听的结果就不一致了。本因发送数据的请求在先,接收数据的请求在后,应当先执行发送请求,可实际上先执行接收数据请求

解决方案 »

  1.   

    串口的读定是独占的,所以读写必须要协调好。一般是一个读一个写的线程或者任务就可以了。我写的是用两个task,一个读一个写。
    因为com是独占性的(本质上是IO操作),所以多个线程一起写com时,很容易引起并发,而导致各种不可意料的情况出现,所以发数据部分使用一个task或者一个线程操作为上。
    其次在读取com口的数据时,com数据是一段一段的。里面其实是一个内存空间,设备不断的往里写数据,然后我们不断的从com中读取数据,所以读取的数据是间歇性的,是片断性的。必须基于通讯的协议进行后续的重组处理,比如返回的数据中是以某个特殊的标志开始,如01,又以特殊的标志结束,如ff。
    可能会疑问,那数据中有可能会有大量的01和ff这样的值,那怎么判断哪个是数据哪个是标志呢?这就是协议通信时的协议起到作用。需要在特定的位置增加一个长度,比如紧跟在01后的就是表示长度的,然后读取到这个长度的数据就是所要的数据了。再之后就是新的数据。
      

  2.   


    思路是对的,一个线程写数据是可行的,但当上位机发送命令后,下位机需要立即返回数据,该种处理方式不知道是否合理,没有测试过。用线程同步可以做到多线程发送,本质上还是你刚描述的,COM是独占的。
      

  3.   


    思路是对的,一个线程写数据是可行的,但当上位机发送命令后,下位机需要立即返回数据,该种处理方式不知道是否合理,没有测试过。用线程同步可以做到多线程发送,本质上还是你刚描述的,COM是独占的。
    嗯。我们开发的项目中是用两个线程,一个读一个写实现的,而且运行的效果还可以。