unit Unit1;
//在窗口添加以下控件,3个ComboBox,2个edit,三个Button,一个Mscomm
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls, OleCtrls, MSCommLib_TLB, StrUtils;
type
TForm1 = class(TForm)
MSComm1: TMSComm;
ComboBox1: TComboBox;
Label1: TLabel;
ComboBox2: TComboBox;
Label2: TLabel;
ComboBox3: TComboBox;
Label3: TLabel;
Edit1: TEdit;
Label4: TLabel;
Button1: TButton;
Button2: TButton;
Button3: TButton;
Edit2: TEdit;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure MSComm1Comm(Sender: TObject);
private
intHexWidth: integer; //电子秤输出为9位的循环
bytReceiveByte: array of byte;
intReceiveLen: integer;
{ Private declarations }
public
{ Public declarations }
run: boolean;
procedure InputManage(mv: oleVariant);
procedure showwet;
procedure clearwet;
procedure showtext(inputstr: string);
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
mscomm1.Settings := '9600,n,8,1';
mscomm1.CommPort := combobox1.ItemIndex + 1;
MSComm1.InputMode := comInputModeBinary; //'二进制方式 适用于XK3190-D2+型电子秤和XK3190-A1+型电子秤和XK3190-A9+型电子秤
MSComm1.RThreshold := 0;
MSComm1.SThreshold := 0;
MSComm1.InBufferCount := 0;
MSComm1.InBufferSize := 1024;
MSComm1.OutBufferSize := 512;
intHexWidth := 9;
run := false;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
if not mscomm1.PortOpen then
mscomm1.PortOpen := true;
end;
procedure TForm1.Button3Click(Sender: TObject);
begin
if mscomm1.PortOpen then
mscomm1.PortOpen := false;
end;
procedure TForm1.clearwet;
var bytemp: array of byte;
begin
setlength(bytemp, 0);
intReceiveLen := 0;
InputManage(bytemp);
end;
procedure TForm1.InputManage(mv: oleVariant);
var i, n: integer;
begin
n := length(mv);
setlength(bytReceiveByte, intReceiveLen + n);
for i := 0 to n - 1 do
bytReceiveByte[intReceiveLen + i] := mv[i];
intReceiveLen := intReceiveLen + n;
end;
procedure TForm1.MSComm1Comm(Sender: TObject);
var v: olevariant;
n: integer;
begin
if not mscomm1.PortOpen then
mscomm1.PortOpen := true;
n := mscomm1.InBufferCount;
V := vararraycreate([0, n], Varvariant);
v := mscomm1.Input;
inputmanage(v);
showwet;
varclear(v);
end;
procedure TForm1.showtext(inputstr: string);
var i, n, m: integer;
valuesstr: array[0..2] of string;
mystr, tagstr: string;
begin
n := length(inputstr);
m := 0;
for i := 1 to n do
if inputstr[i] = '.' then
begin
if length(mystr) = 10 then
begin
valuesstr[m] := mystr;
inc(M);
if m > 2 then break;
end;
mystr := '';
end
else
mystr := mystr + inputstr[i];
if (valuesstr[0] = valuesstr[1]) and (valuesstr[0] = valuesstr[2]) then
begin
mystr := leftstr(rightstr(valuesstr[0], 9), 6); //去头去尾
tagstr := valuesstr[0][8];
n := strtoint(tagstr);
mystr := leftstr(mystr, 6 - n) + '.' + rightstr(mystr, n);
edit1.Text := format('%0.2f', [strtofloat(mystr)]);
end;
end;
procedure TForm1.showwet;
var n, i, myval, hv, lv: integer;
wetstr: string;
mp: char;
begin
n := length(bytReceiveByte);
wetstr := '';
for i := 0 to n - 1 do
begin
myval := bytReceiveByte[i];
if (myval < 32) or (myval > 128) then
mp := char(46)
else
mp := char(myval);
wetstr := wetstr + mp;
hv := trunc(myval / 16);
lv := myval - hv * 16;
if hv < 10 then
hv := hv + 48
else
hv := hv + 55;
if lv < 10 then
lv := lv + 48
else
lv := lv + 55;
if n mod 9 = 0 then
begin
// wetstr := wetstr + #13 + #10;
if length(wetstr) > 120 then
begin
wetstr := rightstr(wetstr, 120);
edit2.Text := wetstr;
showtext(wetstr);
intReceiveLen := 0;
break;
end;
end;
// if intReceiveLen > 524 then
// clearwet;
end;
end;
end.
- 1
- 2
- 3
- 4
- 5
- 6
前往页