串口的数据如果读的位数不对怎么办?(使用spcomm)(10分)

  • 主题发起人 主题发起人 vkjy
  • 开始时间 开始时间
V

vkjy

Unregistered / Unconfirmed
GUEST, unregistred user!
串口的数据如果读的位数不对怎么办?
我用的是spcomm,com1送的数据是连续的,例如61,06;00,00;62,05;00,00;23,06;等等
我需要的数据是61,06(高位在后)和62,05/23,06等等,但是我使用中发现大部分时间都位数错了,读的数据变成了06,00/00,62/05,00/00,23等,中间的间隔无法变了.
b0 := (StrToInt(FloatToStr(@rbuf^)));
b1 := (StrToInt(FloatToStr(@rbuf[i+1]^)));
b1 := (StrToInt(FloatToStr(@rbuf[i+2]^)));
bo/b1/b2就成了6/25088/8960.
我怎么得到1633/1378/1571呀?
begin

viewstring := '';

Move(buffer^,pchar(@rbuf)^,bufferlength);

i := 0;

While i < bufferlength Do
+什么判断条件?
是不是需要判断两个连续的数是否大于0?如果大于关com1,在开com1,直到有正确的数据?
我怎么觉得这个方法不对劲呀~
 
不会是RBUF定义的类型不对吧?
 
viewstring:string;

RBUF,SBUF:ARRAY[1..32] OF BYTE;

我改过16-1024,都是不对
 
既然是用byte数组,那就按字节收进来,然后提取有用的数据即可。你的问题说的不是很明白。
 
if (view1='00') and (view2='00') Then

Begin

if view3='00' Then

begin

view:=inttohex(rbuf[i+2],2)+inttohex(rbuf[i+3],2);

i:=i+4;

Memo1.Lines.Add(view);

Memo1.Lines.Add('');

end

else

begin

if (view4='00') then

begin

view:=inttohex(rbuf[i+1],2)+inttohex(rbuf[i+2],2);

i:=i+3;

Memo1.Lines.Add(view);

Memo1.Lines.Add('');

end

else

begin

//如果view4不等于0

view:=inttohex(rbuf[i+2],2)+inttohex(rbuf[i+3],2);

i:=i+4;

Memo1.Lines.Add(view);

Memo1.Lines.Add('');

end;

end;

End

else

begin

inc(i);

end;

但是我得到的数值全是'00''00'.
请问那里错了?
 
为什么不直接用控制端口的API函数!
 
To : jmlwz
现在已经没有时间改了,当时用的就是spcomm.
 
你到底想干吗呀 ?
你不前不后的搞出一段程序来,怎么看出对错?
你说完整一点,帮你想想!
 
一般串口通讯还是比较可靠的,不会经常出错。
估计你的问题可能的原因是:
1 属性设置有问题
2 数据处理有问题
 
总思路是:
1。打开端口
2。读数据。
3。对数据判断,因为数据每四位,低位可能是00,高位肯定不是00,中间间隔是00,00,我需要判断出我需要的数据。
4。判断数据是否在【x,y】区间。是则继续,认为是正确的数据,否则从新读判断数据。
5。读到正确的数据后循环,每10个数据放入一个数组。
6。一个排序函数,排序。
7。去掉数值最高的3个,去掉数值最低的3个,剩下的4个求平均值。
8。循环100次,得到的数据放入数组,排序,去掉最高的10个数据,去掉最低的10个数据,剩下的求出平均值,显示对话框为数值。
 
用数据包间隔时间控制
或者给每包数据加头表识
 
数据间隔是由于有时候数据没有得到,是存在但是不确定的.
所以没有固定的时间间隔的.
 
1、发送数据的时候给每包数据加一个头标识,接收的时候加以适当的判断,确定包头,然后过滤掉头标识就可以啦
2、其实大多数情况下只要第一包接收正确,以后每包就必然正确啦
所以也可以这样,前三包都发标识符,然后再连续发送数据,只要在接收时从第一个非标识符的地方开始接收就可以了
 
后退
顶部