众高手指教,关于MSComm串口通讯的问题,如何解析二进制数据?急!急!急!不够加分!!!

XDvlper 2003-08-23 12:33:29
我用如下代码接收数据
procedure TForm1.MSComm1Comm(Sender: TObject);
var
vtmp,ovtmp:variant;
bTmp:Byte;
i,ireceived:integer;
begin
if mscomm1.CommEvent =2 then
mscomm1.InputMode:=comInputModeBinary;

iReceived:=mscomm1.InBufferCount;
ovtmp:=mscomm1.Input;
vtmp:=VarArrayCreate([0,17],varbyte);
vtmp:=ovtmp ;
end;
现在我要解析一个18byte的数据包
连续输出格式
STX A B C X X X X X X X X X X X X CR CKS
1 2 3 4 5 6
其中:
1、〈STX〉ASCII起始符(02H)。
2、状态字A、B、C。
3、显示重量 可能是毛重也可能是净重。6位不带符号和小数点的数字。
4、皮重 6位不带符号和小数点的数字。
5、〈CR〉ASCII回车符(0DH)。
6、〈CKS〉可选的校验和。
A的格式为前3位为小数点的位置
0 0 0 XXXX00
1 0 0 XXXXX0
0 1 0 XXXXXX
1 1 0 XXXXX.X
0 0 1 XXXX.XX
1 0 1 XXX.XXX
0 1 1 XX.XXXX
1 1 1 X.XXXXX
我怎样判断数据包并获得像状态字A每一位的置来确定数据的小数点位置呢?
...全文
54 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
XDvlper 2003-11-05
  • 打赏
  • 举报
回复
结贴,散分了!
hellowbh 2003-08-29
  • 打赏
  • 举报
回复
jpyc(九品御厨)
还有 怎么接收时是四个字四个字的接收的呀?
(选择逐行就可以看出来是一次接收了4个字)
hellowbh 2003-08-29
  • 打赏
  • 举报
回复
串口的数据位不是5/6/7/8吗?
象这个18位的数据怎么接收呀? 本人愚笨,请大家指教。
hiflower 2003-08-29
  • 打赏
  • 举报
回复
var
InputBytes:array of Byte;

MSComm1.InputMode:=comInputModeBinary;
InputBytes:=MSComm1.Input;
XDvlper 2003-08-28
  • 打赏
  • 举报
回复
问题我已经解决了,要取状态字A的低3位,只需将vtmp[1]即A的值于$07按位与即可,
vtmp[1] and $07就是低三位的值。
另外,我在http://www.csdn.net/develop/article/20/20663.shtm上发现了一个非常简单的函数:
function GetBit(i: Cardinal; n: Cardinal): Boolean;
begin
Result := Boolean((i shr n) and 1);
end;

这个函数只需改改i的类型为byte就行,即
function getbit(i:byte;n:integer):integer;
begin
result:=(i shr n) and 1;
end;
这样getbit(i,n)就返回的值就是i的第n位,够简单吧
hellowbh 2003-08-28
  • 打赏
  • 举报
回复
你的问题解决了吗?
能否也发给我学习学习?hellowbh@163.net 谢谢。
hellowbh 2003-08-28
  • 打赏
  • 举报
回复
可是我发到超级终端或别的测试程序中,就显示正常。
并且,发的文字是我直接写的,不是从网站上弄的。
jpyc 2003-08-28
  • 打赏
  • 举报
回复
呢个显示问题,可能是你发送了一些不可见字符,如从网页上随便考一下,就包含好多,对于MOME/RICHEDIT这些显示控件的显示就有问题,发送可见字符就好了,其它几个串口软件我也试过,也有类似问题,有的解决方案是:过滤掉不可见字符,这样有问题,就是你收到并显示的数据就肯定不真实了。
hellowbh 2003-08-28
  • 打赏
  • 举报
回复
XDvlper(XDeveloper)
我也需要设计一个电子称接受数据的程序,好像我们的电子称是一个型号的。
我以前没有做过串口(我一般做企业管理方面的程序),你能否把你的程序发给我呢?
愿我们能够互相学习,互相帮助。谢谢你。hellowbh@163.net
tonylk 2003-08-26
  • 打赏
  • 举报
回复
var
vTmp:variant;
...
begin
CodeSize:=MsCommCall.InBufferCount;
if CodeSize>0 then begin
vTmp:=VarArrayCreate([0,CodeSize-1],varByte);
vTmp:=MsCommCall.Input;
Code:=vTmp[CodeSize-1];
end
else begin
Code:=C_None;
end;
...

mscomm返回的类型是variant类型的数组,所以delphi端也要用variant数组去接收,不然就会损失掉高位,返回结果就不对了,用variant数组取得数据后,再赋给byte型就可以正常使用了。
hellowbh 2003-08-26
  • 打赏
  • 举报
回复
jpyc(九品御厨)

你的串口调试程序怎么收到的文字有乱码呢?
我发的是一小篇文章,用你的发到超级终端或别的串口测试程序中则没有乱码。
我修改了你的程序,在接收同时保存到一个文件中,结果保存的文件正常,而你的程序显示的有乱码。
说明你的程序发送,接收都没有问题,只是在Memo_show中显示有问题,请问怎么改正?
hellowbh 2003-08-26
  • 打赏
  • 举报
回复
你先用jpyc(九品御厨)串口通讯控制器先收一些数据,分别为16进制和非16进制,然后把结果贴出来,让大家看看。也好帮你分析分析。
hellowbh 2003-08-26
  • 打赏
  • 举报
回复
你的数据是18byte,每个byte 8个bit,是吗?
XXSingle 2003-08-26
  • 打赏
  • 举报
回复
我也在找资料...........
hellowbh 2003-08-26
  • 打赏
  • 举报
回复
我表示关注。
jpyc 2003-08-23
  • 打赏
  • 举报
回复
http://218.56.11.178:8020/web/technology.aspx

-》下载基地-》例程-硬件控制-》串口通讯控制器/spcom事例程序

-》控件-硬件控制-》spcom/TurboPower Async Professional
jpyc 2003-08-23
  • 打赏
  • 举报
回复
参考一下,方法是一样的:

http://218.56.11.178:8020/web/technology/chuangkou.htm

5,388

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧