两个串口,同时上送相同的数据,需要实时监测 1.若两个数据内容一致,才能判断来的信息有效,然后做相应的后续处理 2.若一串口有数据,另一个没有,则要延时等待那个没有数据上来的串口,超时则给出链路不通的警告。
  这样的功能如何实现?急!!!

解决方案 »

  1.   

    我一般都用spcomm这个串口通讯控件,这个控件在收到数据时,会触发ReceiveData事件。以上两位大虾都是建议每个串口各对应一个串口。
       1.那么我究竟是要将这个两个串口控件放在主界面上(主线程)来接收呢,还是在各自的线程里面创建各自的串口控件?
      2.因为我两个串口必须是同时(同接收顺序)收到相同的数据。如何来判断一个线程收到了数据,另一个没有收到数据?是不是一旦有一个线程收到数据时,就要起一个新的线程开始判断超时?
      

  2.   

    我原来也写过串口的接收,SPCOMM也不错的控件。它在接收的数据时,你可以设置一个状态,对应俩个串口是否已经接收数据,如果都已经接收了,就比较接收的字符串,就可以实现了。如果没接收,就等待,或是等待接收延时,做为无效数据,循环接收,
    SPCOMM,可以分别打开串口的位置,
      

  3.   

    to: qingfengsishi 还是没有明白你的意思。
      到底是用2个spcomm控件,还是只用1个(引用:“可以同时打开多个串口的位置”)
      

  4.   

    用两个SPCOMM,以你来说,可以两个串口的内容应该有关联,那么你应该定义相应的串口状态变量。例如每一个串口当前可以用以下状态表示
    commstate = record 
      state: type of (idle,havedata)
      dataid: youtype
    end;
    那么当任意一个串口来数据后,我可以获得其数据ID,这时我比较另一个串口的数据ID以及以及他的
    state就可以判断此一帧数据是否有效
      

  5.   

    用两个SPCOMM,分别操作两个串口,两个ReceiveData事件。事件当中接收串口数据完毕后把数据放到主线程中。比如设个全局变量data1,data2分别对应两个串口的数据。这时串口接收完毕。用一个timer或一个线程处理data1和data2,当都不为''时,做你的判断处理,处理完之后再设为空。
      

  6.   

    to:cjf1009(农民程序员) 感谢解答。
      还是有疑问:
      1. 两个spcomm是放在程序的主界面上,还是置于两个通讯线程中?
      2. 两个spcomm若放在主界面即主线程中,那么用户对界面的操作(含数据库查询统计)会耗时较
         长,会阻塞影响spcomm的数据接收和发送。
      3. 两个spcommm若分别放在两个线程里面,那每个线程实现什么功能?spcomm的ReceiveData事    
         件在线程里面也会自动触发吗?那么线程的Execute过程要执行什么功能?是检测两个数组吗,
         一个是收到的数据,一个是待发送的数据?
      

  7.   

    1.主界面。
    2.他们说spcomm本身就是多线程的,我也没搞太懂。但你对界面的操作,应该不会影响spcomm的数据接收和发送。即使用多线程,对vcl的操作也是要放到主线程中去的。
    3、我没有那样做过。一般都是在spcomm的ReceiveData事件中触发线程。两个串口应该是互不影响的。
      

  8.   

    一个就可以了!
    一个控件用俩个命令打开com1\com2
      

  9.   

    to:cjf1009(农民程序员) 非常感谢!
        你的意思是说,在spcomm的ReceiveData事件中将收到的数据分别写入两个全局的数组中队列中,同时启动检测线程,扫描两个全局数组队列,检测是否同时收到相同的数据。然后进行相应的处理?
      

  10.   

    mksnoopy(一起来) :
    就是这个意思。动手去写程序吧,或者你会有新的发现和更好的办法呢!