delphi xe 电子秤 代码
时间: 2023-07-02 12:08:28 浏览: 69
以下是一个简单的 Delphi XE 电子秤应用程序的示例代码,通过串口通信读取秤的重量数据:
```delphi
unit Unit1;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.ExtCtrls, Vcl.ComCtrls;
type
TForm1 = class(TForm)
Memo1: TMemo;
Timer1: TTimer;
procedure FormCreate(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
{ Private declarations }
FComHandle: THandle;
FWeight: Double;
function OpenCom(Port: Integer): Boolean;
procedure CloseCom;
function ReadCom(var Buffer; Count: Integer): Integer;
function FindCom: Integer;
procedure ParseWeight(const Data: AnsiString);
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
const
CRLF = #13#10;
procedure TForm1.CloseCom;
begin
if FComHandle <> INVALID_HANDLE_VALUE then
begin
CloseHandle(FComHandle);
FComHandle := INVALID_HANDLE_VALUE;
end;
end;
function TForm1.FindCom: Integer;
var
i: Integer;
ComName: string;
DCB: TDCB;
begin
Result := 0;
for i := 1 to 16 do
begin
ComName := '\\.\COM' + IntToStr(i);
FComHandle := CreateFile(PChar(ComName), GENERIC_READ or GENERIC_WRITE, 0, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
if FComHandle <> INVALID_HANDLE_VALUE then
begin
FillChar(DCB, SizeOf(DCB), 0);
DCB.DCBlength := SizeOf(DCB);
if GetCommState(FComHandle, DCB) then
begin
DCB.BaudRate := CBR_9600;
DCB.ByteSize := 8;
DCB.Parity := NOPARITY;
DCB.StopBits := ONESTOPBIT;
DCB.XonChar := #11;
DCB.XoffChar := #13;
if SetCommState(FComHandle, DCB) then
begin
Result := i;
break;
end;
end;
CloseHandle(FComHandle);
FComHandle := INVALID_HANDLE_VALUE;
end;
end;
end;
function TForm1.OpenCom(Port: Integer): Boolean;
begin
Result := False;
FComHandle := CreateFile(PChar('\\.\COM' + IntToStr(Port)), GENERIC_READ or GENERIC_WRITE, 0, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
if FComHandle <> INVALID_HANDLE_VALUE then
begin
Result := True;
end;
end;
function TForm1.ReadCom(var Buffer; Count: Integer): Integer;
begin
if FComHandle = INVALID_HANDLE_VALUE then
begin
Result := 0;
Exit;
end;
ReadFile(FComHandle, Buffer, Count, Result, nil);
end;
procedure TForm1.Timer1Timer(Sender: TObject);
var
Data: AnsiString;
Buffer: array [0..255] of AnsiChar;
BytesRead: DWORD;
begin
if FComHandle = INVALID_HANDLE_VALUE then
begin
Memo1.Lines.Add('正在查找电子秤...');
if FindCom > 0 then
begin
Memo1.Lines.Add('电子秤已连接,正在打开串口...');
if not OpenCom(FindCom) then
begin
Memo1.Lines.Add('打开串口失败!');
Exit;
end;
Memo1.Lines.Add('串口已打开,正在读取数据...');
end
else
begin
Exit;
end;
end;
if ReadCom(Buffer, SizeOf(Buffer)) > 0 then
begin
Data := Data + AnsiString(Buffer);
if Pos(CRLF, Data) > 0 then
begin
ParseWeight(Data);
Data := '';
end;
end;
end;
procedure TForm1.ParseWeight(const Data: AnsiString);
var
S: AnsiString;
P: Integer;
begin
S := Trim(Data);
P := Pos(' ', S);
if P > 0 then
begin
S := Copy(S, 1, P - 1);
FWeight := StrToFloatDef(S, 0);
Memo1.Lines.Add(Format('重量:%f', [FWeight]));
end;
end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
CloseCom;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
FComHandle := INVALID_HANDLE_VALUE;
FWeight := 0;
end;
end.
```
注意:上述代码仅供参考,具体实现可能需要根据具体的电子秤型号和通讯协议进行调整。