最近在使用Remon Spekreijse的CSerialPort类编写一个称重系统。整个项目内容如下:用PC通过串口连接11台配料机,配料机上的称重仪表使用的是深圳杰曼科技的GM88048C仪表,PC与仪表通信采用的协议使用的是Modbus
RTU协议。称重系统主要的通信功能是:1.通过PC向仪表发送指令设置配料机的目标值等2.通过PC向仪表发送指令控制配料机开始运行、结束运行等3.通过PC向仪表发送指令读取仪表中实时的称重数据。通信基本没有问题。称量的流程:在发送完开始运行命令后,需要实时读取称重数据并在PC上显示。等到所有的配料机的配料数据合适时,在程序中点击保存数据的按钮,结束运行并将最终的称量数据保存到数据库中。但由于程序一直在循环读仪表的数据,保存数据的按钮不能响应点击消息导致不能保存数据。目前的问题是:如何做到既能实时读取并显示仪表数据,又能在确定数据可以保存的时候及时的发送停止命令并保存数据。注:配料机结束运行时,会进行翻到之类的操作,要求的是在这期间也应实时显示数据。我的程序中所有对于读写消息的指令均在OnCommunication函数中处理,对多个仪表的读取采用环的方式即当上一个仪表读取成功时才对下一个仪表进行读取操作。我的思路是:采用多线程,即有个线程一直在负责采集数据,另外一个线程负责发送开始运行、停止运行等命令。但是由于对消息的处理都在OnCommunication函数中,这就要求多个线程共用这个函数,但该函数中有共享变量,估计处理时会很复杂,现在对多线程不了解,不知这个能否不用多线程做?希望各位朋友帮帮忙,最近因为这个挺闹心的

解决方案 »

  1.   

    不知道你的数据传输速度和数据处理复杂不。我以前做的串口程序,因为数据处理不是太复杂,都是放在主线程中做的,大概50ms左右便会接收一次数据,20个字节左右,不会造成界面不响应。
      

  2.   

    数据传输速度是9600,数据处理就是接收到完整的响应消息(最多13个字节),从中取得数值,不是太复杂。我的程序现在关键是因为有多台配料机,需要一直实时显示数据,整个程序的流程一直处在发送命令和接受消息响应的循环中去了,不知道怎么从这个循环中跳出来
      

  3.   

    我觉得应该采用多线程实现,那样才不会造成主线程的堵塞!