我现在在一台机器上调试程序,用了两个SPCOMM,一个负责发数据,在COM1口,另外一个负责接收数据,在COM2口。
我在按钮里写发送的事件,然后在Memo上显示结果。结果接受和发送的一样。本来以为差不多有个雏形了,但是我快点几下就出问题了,接受的程序把多个发送的桢当成一个来接受了,也就是说接受的是发送的几倍。如果在真实的环境中这可不行呀。所一想问问大家有没有什么好的办法解决这个问题,前提是我可不想丢数据,或者只接受其中的一部分。谢谢。
本来想把代码贴出来,可是CSDN老是说我在做伤害它的事情!靠!贴不了就不贴了吧,还希望大家帮忙。

解决方案 »

  1.   

    现在发送不归我管,客户端是不定时发送,而且不只一个客户端,我接受的时候可能不知道从哪里来的,所以好象不太好控制,有没有从接收函数那里的比较根本的控制方法?我刚用SPCOMM所以不熟悉,发贴子的目的就是想看看有没有什么宝贵的经验,希望大家不吝赐教!谢谢!
      

  2.   

    你接收到多个字节为一帧是因为SPCOMM在一个指定的时间段内接收到了多个字节.设置SPCOMM的ReadIntervalTimerOut属性,将超时时间设置短一点.
      

  3.   

    非常的谢谢 suuare(督察) 
    请问关于SPCOMM还有什么好的方法或值得借鉴的经验吗?
      

  4.   

    呵呵  这个嘛
    使用时,假如你希望接收诸如0x00,0x1A.....等特殊的SPCOMM自定义的字节 需
          Comm1.Inx_XonXoffFlow := False;
          Comm1.Outx_XonXoffFlow := False;
    我开始用的时候总有一些东西收不全 后来才发现........  
      结贴吧!
      

  5.   

    最好的方法就是:定义一个数据包的结束标志(例如:#13),在接受端判断到此标志为一个有效数据包(TCP传输数据也是这么做的)。这个问题跟SPCOMM关系不大,如果不想改接受端程序的话就很难做了。
      

  6.   

    有点错误,是SLIP。
    S L I P的全称是Serial Line IP。它是一种在串行线路上对I P数据报进行封装的简单形式。
    下面的规则描述了S L I P协议定义的帧格式:
    1) IP数据报以一个称作E N D(0 x c 0)的特殊字符结束。同时,为了防止数据报到来之前
    的线路噪声被当成数据报内容,大多数实现在数据报的开始处也传一个E N D字符(如果有线
    路噪声,那么E N D字符将结束这份错误的报文。这样当前的报文得以正确地传输,而前一个
    错误报文交给上层后,会发现其内容毫无意义而被丢弃)。你完全可以参考。
      

  7.   

    谢谢 zzllabc(抱朴子--清心释累,绝率忘情) 的建议!
    最后一个问题,马上结帖。
    0x00,0x1A怎什么是特殊的SPCOMM自定义的字节?他们对程序有什么影响?他们有什么作用?我怎么看还有什么特殊的字节?
      

  8.   

    其实就是一些特殊字符,对程序没有影响,假如你以0x00为包的结束标志,那在程序接收到后检测到一个0x00就认为此包结束,然后处理,再接受下一个包。其他特殊字符还有例如ESC等等不可见字符。
      

  9.   

    楼上说的没错  基本上通信协议都需要自定的  SPCOMM只是罗列了一些常用的  你把这些都屏蔽掉  然后自己加