有一台电子称协议如下:
串口通讯协议:
采用232接口,所有数据均为ASCII码,每组数据有10位组成,第一位是起始位,第10位是停止位,中间8位为数据位
连续方式通信协议(该称是连续不断的自动发送数据):
起始 符号 净重 扣重 小数点 单位 校验 结束符
起始:02H(十六进制,一个字节)
符号:+/-,净重的符号(ASCII码,一个字节)
净重:占6字节,高位在前(ASCII码)
如净重为1000(十进制),转换为16进制为03E8H,则为0 0 0 3 E 8
扣重:与净重相同
小数点:0-4,表示小数点的位数(1字节)
单位(1字节)
校验:除起始位外前面的各字节进行共或运算(XOR)得到的数值
-------------------------------------------
-------------------------------------------
我用commportDriver组件,receivedata事件如下(我只要获得净重的数据):
procedure TForm1.CommPortDriver1ReceiveData(Sender: TObject;
DataPtr: Pointer; DataSize: Cardinal);
Var P,TP,First:Pchar;
Decim:Integer;
WeiStr:String;
WeiReal:Real;
I:Integer;
begin
p:=dataptr;
weistr:='';
p:=p+7; //这里不知取净重该从第几位取
if (datasize=16) then
begin
for i:=1 to 6 do begin
weistr:= weistr+p^;
inc(p);
end;
Edit1.Text:=trim(weistr);
Memo1.Lines.Add(trim(weistr)+#13);
end
end;
-------------------------------
-------------------------------
问题:
1.取净重应该从第几位开始取?也就是上面的p:=p+?
2.按上述代码每次memo里面显示的字符串都不是相同的(有时候是净重,有时候是16位中其他字符),根据协议是不是除了判断字符串是16位以外还要加其他条件,还是我根本就不正确?如何保证我每次取得都是净重?
串口通讯协议:
采用232接口,所有数据均为ASCII码,每组数据有10位组成,第一位是起始位,第10位是停止位,中间8位为数据位
连续方式通信协议(该称是连续不断的自动发送数据):
起始 符号 净重 扣重 小数点 单位 校验 结束符
起始:02H(十六进制,一个字节)
符号:+/-,净重的符号(ASCII码,一个字节)
净重:占6字节,高位在前(ASCII码)
如净重为1000(十进制),转换为16进制为03E8H,则为0 0 0 3 E 8
扣重:与净重相同
小数点:0-4,表示小数点的位数(1字节)
单位(1字节)
校验:除起始位外前面的各字节进行共或运算(XOR)得到的数值
-------------------------------------------
-------------------------------------------
我用commportDriver组件,receivedata事件如下(我只要获得净重的数据):
procedure TForm1.CommPortDriver1ReceiveData(Sender: TObject;
DataPtr: Pointer; DataSize: Cardinal);
Var P,TP,First:Pchar;
Decim:Integer;
WeiStr:String;
WeiReal:Real;
I:Integer;
begin
p:=dataptr;
weistr:='';
p:=p+7; //这里不知取净重该从第几位取
if (datasize=16) then
begin
for i:=1 to 6 do begin
weistr:= weistr+p^;
inc(p);
end;
Edit1.Text:=trim(weistr);
Memo1.Lines.Add(trim(weistr)+#13);
end
end;
-------------------------------
-------------------------------
问题:
1.取净重应该从第几位开始取?也就是上面的p:=p+?
2.按上述代码每次memo里面显示的字符串都不是相同的(有时候是净重,有时候是16位中其他字符),根据协议是不是除了判断字符串是16位以外还要加其他条件,还是我根本就不正确?如何保证我每次取得都是净重?
解决方案 »
- 在原程序中新增几个画面后,在编译程序时报资源重复
- DELPHI与汇编源代码下载
- 因转做公务员,低价转让一批2004年买的Delphi书籍
- 要是自动升级程序和主软件一起做成一个EXE,那么自动升级此EXE文件时是否能运行升级程序且将自动升级程序一起升级了呢
- 请问高手:如何用数据绑定控件正确显示数据库中的时间字段
- 菜鸟新问题:怎样在窗体启动时,有两个日期控件,一个是显示今天的日期,另一个是显示3个月前的日期
- 请问各位:怎么得到一个文件的修改时间??
- 一个被搞晕的问题
- 关于打印的问题,挺急的
- 寻找好用的dbgrid和报表控件(分不够,可以再加)?
- 各位朋友,一个公司让我去开发短信增值业务SP类型的软件,我delphi初学,都包括什么技术含量呀?感谢
- 新手求助,存储过程问题
begin
iLen := DataSize;
//if iLen <> 16 then exit; 如果长度不对,就退出 p:=dataptr;
i := 0;
while (i<iLen) do
begin
if (p^ = 0x02) then break;
inc(p)
end;