回 帖 发 新 帖 刷新版面

主题:[讨论]VFP mscomm控件,收到的数据比发送的数据长度要长。

我在编写一个从一台电压表读取数据的小程序该数据的格式是"0FFH开头6个ASCII字符两个状态字节0DH节尾"十个字节组成。我使用的是VFP9.0的mscomm控件。在中间发现一些问题和达人们讨论一下。我用一根串口线连接2口3口完成串口的单机调试。我的程序是定义两个时间控件,一个mscomm控件,一个控件负责发送数据,一个时间控件不停的读取数据。接收程序如下
buf = TRANSFORM(thisform.olecontrol1.input) &接收到的数据成为字符型数据,第个数据的长度为2
thisform.text2.Value = STR(LEN(buf)) &text2显示接收到的原始数据的长度
if LEN(buf) => 20 THEN 
 wz = AT("FF",buf)
 wz1 = AT("0D",buf)
x = SUBSTR(buf,wz,20)
buf = SUBSTR(buf,wz1+1)
thisform.edit2.Value = x + thisform.edit2.Value
thisform.text1.Value = len(thisform.edit2.value) & text1 显示经过分析的数据长度
endif
通过比较text1和text2的数据不同可以判断是否成功将读取的数据分成我所需要的若干段数据。
发送数据的代码如下
z = z +1

thisform.olecontrol1.output = CREATEBINARY(CHR(255))
FOR xu = 1 TO 8 
thisform.olecontrol1.output = CREATEBINARY(CHR(xu))
endfor
thisform.olecontrol1.output = CREATEBINARY(CHR(13))
thisform.text3.Value = STR(z)
IF z => 100
z = 0
thisform.timer2.Enabled = .f.
endif
通过上面该控件可以不停的对串口发送长度为1000的数据即z的值为100。
如果我接收到的数据长度text1和text2的值为2000的话那么该数据传输就是准确的了。
但是实际情况是我接收的数据经常会出现当时z为100时,text1与text2的值不一致。
同时,会出现接收到的数据要比发送的数据整整多出几组。或少出几组的情况。
这样的情况能避免么?是什么原因造成的呢?我的代码有什么问题请大家指正。

回复列表 (共1个回复)

沙发


另外因为我是使用一台脑调试的,当我的电脑发送信息的时侯,我的缓冲区里的第一组数据一定是一组完整的十字节数据.我担心如果我用ONCOM事件控制的话会出现,当我设置成trhread = 10 ,inputlen = 10的话.正好我开始接收数据后缓冲区里我接收的第一组数据不完整.而我依旧接收长度为10的数据,造成我读取数据不正确.如果我将rthead = 20 ,inputlen = 20.遇到上述情况,则每读取二十个字节,读入下面一段数据08090DFF0102030405060708090DFF01020304050607只能截取中是这组完整的数据头与尾部的数据则不要了.我感觉太影响准确性.请问各位达人,如果使用oncom事件,有什么方法能克服这个缺点么?

我来回复

您尚未登录,请登录后再回复。点此登录或注册