小弟顷吾所有请教一个串口数据包问题?(100分)

  • 主题发起人 主题发起人 j.hailong
  • 开始时间 开始时间
J

j.hailong

Unregistered / Unconfirmed
GUEST, unregistred user!
现在串口联有一个扳手,我想用计算机控制此扳手动态的改变
它的参数设置。现在知道它的数据包格式,如下

pos number content example
0 1 Packet Type 's' 's'
1-3 3 Unit Number/Network Id '001'
4-6 3 Channel Number '001'
7 1 Parameter Set 'A'
8-10 3 Parameter Number 'P28'
11-18 8 Parameter Data <32><32>'123.45'
19 1 CR <13>
20 1 Checksum Including CR X
21 1 LF <10>

我用mscomm.output:=
'S001001AP28'+chr(32)+chr(32)+'123.45'+chr(13)+'X'+chr(10)
可是总是说我第20位有错误 Checksum Error
谁能告诉我这个位应如何来写?
从发送过来的数据包看,这个位上出现的没有规律,什么符号都有
另外数据包格式里有这样的字段

121-122 2 Value1(Hi,Lo) <00><75>

我应该如何取出使用,好像是一些图象的数据,但我不会取出来使用
小弟第一次使用串口,还请各位大侠多帮助!!!!!!!
现行谢过!!!!!!
 
你没有说明校验码是怎么计算的呀.
 
你光放上一个'X'当然不行了,要是和校验应该
b := 0;
for i := 1 to 19 do b := b + ord(s);
s[20] := chr(b);
 
to iee:
小弟太笨看不懂,能不能解释一下!!!!!!!
谢谢!!!
 
按照你说的数据包格式,第20位是校验和,即前19位数据累加。
接收的数据也要按协议来拆解。
 
to chll:
如果我这样写mscomm.output:=
'S001001AP28'+chr(32)+chr(32)+'123.45'+chr(13)+'X'+chr(10);
那么20位应该如何写啊!
谢谢了!!!

 
你光放上一个'X'当然不行了,要是和校验应该
b := 0;
for i := 1 to 19 do b := b + ord(s);

mscomm.output:=
'S001001AP28'+chr(32)+chr(32)+'123.45'+chr(13)+char(b)+chr(10);

 
那个校验和并不是直接累加就可以了,得看双方怎么约定。当然比较简单的就是加起来。
还有要注意的地方,你的数据包以‘S’开头,共21个字节,如果有很多数据包,而且发
送速度也比较快的时候,中间有什么数据丢了,你就很难保证正确了。你可能说,我在从
以‘S’开头的部分开始接收,但是你想想,那个校验和难道就能保证不是‘S’吗!
 
谢谢大家:
我还是不知道如何解决!!!
to qdshen 那里来的s
b := 0;
for i := 1 to 19 do b := b + ord(s);
什么意思,我真的很笨的,能不能解释一下,





 
第20个字节Checksum Including CR从字面上是和校验,一般就是把前面的数据累加。
代替那个X,我想你要是再问的话就没办法再干这行了,呵呵。
 
X是校验位,是包含CR在内的校验和,并不是说让你放个X
for i := 1 to 19 do b:= b+ ord(s);
是计算出校验和赋给b,s就是你要发的从1到19位数据
 
谢谢大家了!
第一个问题已经解决了,非常感谢。
但第二个问题还不知道如何做,还望赐教!
周末结帐,一定!
 
谢谢大家的帮助!!!
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
1K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
890
SUNSTONE的Delphi笔记
S
D
回复
0
查看
2K
DelphiTeacher的专栏
D
后退
顶部