电子秤串口读数据的问题,大家帮忙看看。120分

fdadd 2005-03-30 07:39:56
通信协议: 波特率:600,1200,2400,4800可选。
字节格式:1位起始位
8位数据位
1位校验位(当校验方式为“NON”时,则无校验位)
1位停止位
串行口有两种工作方式。一种是连续方式,即仪表每测量一次便将结果通过串行口发送出去;另一种是命令方式,即仪表只有收到命令时才将当时的测量结果发送出去。

a、 命令格式(ASCⅡ码):
READ〈CR〉﹁〈LF〉﹂ 即52H 45H 41H 44H 0DH ﹁0AH﹂

b、仪表发送的数据格式:
仪表发送的一个完整数据由五个字节构成,其中一个标志字节(FFH),一个状态字节和三个数据字节(压缩BCD码,低位在前),
//**************代码***************************************//

procedure TForm1.Comm1ReceiveData(Sender: TObject; Buffer: Pointer;
BufferLength: Word);
var
s : string;
i : integer;
rbuf : array[0..100] of byte;
begin
//s:='';
ZeroMemory(pchar(@rbuf),100);
move(buffer^,pchar(@rbuf)^,bufferlength);
for i:=1 to bufferlength do
s:=s+inttohex(rbuf[i],2)+'';
//memo1.lines.add(Format('%d',[StrtoInt('$'+s)]));
memo1.lines.add(s);

{
SetLength(S, BufferLength); //接收RS232的数据并显示Memo1上。
Move(Buffer^, PChar(S)^, BufferLength);
Memo1.Lines.Add(S);
}
end;

procedure TForm1.BitBtn1Click(Sender: TObject);
begin
Comm1.CommName :='com1';
Comm1.Baudrate :=strtoint(ComboBox1.Text);
Comm1.ByteSize:=_8;
Comm1.parity:=None;
Comm1.StopBits:=_1;
//Comm1.RtsControl
Comm1.StartComm;
end;

procedure TForm1.BitBtn2Click(Sender: TObject);
begin
comm1.StopComm;
end;
//***************出现问题*******************************//
秤上的数为420,显示为8200372,不对,高手请给与指点。
...全文
584 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
GGBOYS 2005-04-13
  • 打赏
  • 举报
回复
http://www.56kc.net/web/commwatch.aspx

建议先手动输入指令测试,然后用程序实现.
herman~~ 2005-04-06
  • 打赏
  • 举报
回复
帮顶
ffwin 2005-04-06
  • 打赏
  • 举报
回复
XuDunYu(西门吹雪)是对的
vinsonshen 2005-04-06
  • 打赏
  • 举报
回复
up
XuDunYu 2005-04-05
  • 打赏
  • 举报
回复
for i:=1 to bufferlength do
s:=s+inttohex(rbuf[i],2)+'';
不对应为
for i:=0 to bufferlength - 1 do
s:=s + inttostr((ord(rbuf[i]) div 16)*10 + (ord(rbuf[i]) mod 16)) + ' ';
Heyongfeng 2005-04-05
  • 打赏
  • 举报
回复
转换的问题
zxwgm 2005-04-03
  • 打赏
  • 举报
回复
你没有判断起始位啊!要一个一个地把数据读出来啊!我有VB写的,QQ:11562659
kylejiang 2005-04-03
  • 打赏
  • 举报
回复
你好。你的问题解决了吗?我想知道你是怎样做的。好吗?我的QQ:9722794 ,向你请教一下。
kylejiang 2005-04-03
  • 打赏
  • 举报
回复
关注ing
xujun77 2005-03-31
  • 打赏
  • 举报
回复
那直接从COM读取的数据是什么?会不会是在转换的时候位置错位了?
fdadd 2005-03-31
  • 打赏
  • 举报
回复
那应该怎么进行转化?给个例子
laiqinghe 2005-03-31
  • 打赏
  • 举报
回复
ZeroMemory(pchar(@rbuf),100);
move(buffer^,pchar(@rbuf)^,bufferlength);
for i:=1 to bufferlength do
s:=s+inttohex(rbuf[i],2)+'';
从这些步骤里开始跟踪一下 F7


楼上的 可能楼主要16进制显示吧 为什么不直接转换成ascii ??我也疑问 但好象不是问题的所在
cjf1009 2005-03-31
  • 打赏
  • 举报
回复
跟踪代码,看看是哪里不对。
应该是数据转换的时候,为什么不直接转换成ascii码?
for i:=1 to bufferlength do
s:=s+char(rbuf[i])+'';
skertone 2005-03-31
  • 打赏
  • 举报
回复
for i:=1 to bufferlength do
s:=s+inttohex(rbuf[i],2)+'';


秤上的数为420,显示为8200372

这个 s 输出没? 应该是偶数个字符呀。

vinsonshen 2005-03-31
  • 打赏
  • 举报
回复
UP
cjf1009 2005-03-31
  • 打赏
  • 举报
回复
rbuf : array[0..100] of byte;

看你这个声明,串口传过来的数据应该是10进制数,所以你就不用管什么16进制了,直接转成ascii码:
for i:=1 to bufferlength do
s:=s+char(rbuf[i])+'';
memo1.lines.add(s);

如果你保证串口过来的数据是正确的,那肯定是你转换的错误。

1,593

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 网络通信/分布式开发
社区管理员
  • 网络通信/分布式开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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