关于串口的实时通信程序,与串口的通信单独写在一个子线程中。通过SPCOMM与串口的单片机进行交互。在子线程中读取数据是采用定量分批读取。每次从串口读取一定量的数据放在缓冲区,处理完毕后,再次从串口读取,直到没有可以处理的数据。
    在子线程运行过程中(即与串口通信中),如果主线程执行的操作用时不长或数据量不大时,串口通信很正常。子线程可以将所有数据读回,可是当主线程执行的操作用时长(如执行一个很长的循环)或数据量很大(从数据库中读取几千条记录)时,子线程就不能将所有的数据都读回。
  不能理解为什么会出现这样的情况,本人怀疑与内存或SPCOMM有关,可是这方面的知识匮乏,只好请教各位高手了。

解决方案 »

  1.   

    不应该是SPCOMM的问题,这个可是很强的控件啊,
    可能是缓冲区问题,或者是主线程占用CPU过高,导致子线程在串口缓冲区满时还不能读取数据。
    这样看行不行,设置一个比较大的缓冲区,保证在一定时间内缓冲区不满,子线程将数据读取到缓冲区中(保留缓冲区写位置,循环写入),主线程负责处理数据,处理完数据后对缓冲区置位,并保存当前处理完了的缓冲区位置。
      

  2.   

    好象遇见过类似的情况,需要在读数据的间隔中加入一个延迟,例如:读一条数据.......sleep(600);读下一条数据.......
      

  3.   

    可能你主线程处理的时候 导致别的线程抢不到CPU时间。。数据丢失。
      

  4.   

    建议 写log文件进行 调试 看是什么问题。。
      

  5.   

    将SPCOMM内部的缓冲区大小等常量调大试试
      

  6.   

    谢谢各位!!
    问题已经解决,问题出在了主线程对CPU时间片的占用时间太长。导致在一定时间内串口收不到单片机发送过来的数据,当这种情况出现在我向单片机发送命令而等待回应时,我就会以单片机没有收到命令码再次发送来处理,当我发送的命令码为清空交互数据的缓冲区时,则会清空还未处理的数据,造成数据丢失。现跟单片机程序开发组协商后,以解决这个问题。谢谢大家!
    散分结贴!