通信协议: 波特率: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,不对,高手请给与指点。
字节格式: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,不对,高手请给与指点。
应该是数据转换的时候,为什么不直接转换成ascii码?
for i:=1 to bufferlength do
s:=s+char(rbuf[i])+'';
move(buffer^,pchar(@rbuf)^,bufferlength);
for i:=1 to bufferlength do
s:=s+inttohex(rbuf[i],2)+'';
从这些步骤里开始跟踪一下 F7
楼上的 可能楼主要16进制显示吧 为什么不直接转换成ascii ??我也疑问 但好象不是问题的所在
for i:=1 to bufferlength do
s:=s+char(rbuf[i])+'';
memo1.lines.add(s);如果你保证串口过来的数据是正确的,那肯定是你转换的错误。
s:=s+inttohex(rbuf[i],2)+'';
秤上的数为420,显示为8200372这个 s 输出没? 应该是偶数个字符呀。
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)) + ' ';