!!!참 쉽지 않네용, 고수님들의 조언을 부탁드립니다.
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
CPort, CPortTypes, CPortCtl, Registry, StdCtrls;
const
SendStart = Chr($73) + Chr($10) + Chr($04) + Chr($10) + Chr($40) + Chr($50) + Chr($AA);
SendData = Chr($73) + Chr($10) + Chr($04) + Chr($10) + Chr($60) + Chr($70) + Chr($AA);
RecvStart = Chr($73) + Chr($50) + Chr($04) + Chr($10) + Chr($30) + Chr($20) + Chr($AA);
RecvEnd = Chr($73) + Chr($50) + Chr($04) + Chr($01) + Chr($70) + Chr($60) + Chr($AA);
type
TForm1 = class(TForm)
ComPort1: TComPort;
ComDataPacket1: TComDataPacket;
ListBox1: TListBox;
Memo1: TMemo;
Button1: TButton;
Button2: TButton;
procedure ComDataPacket1Packet(Sender: TObject; const Str: String);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
function StrToHex(const S: string): string;//16진수변환
public
{ Public declarations }
com_port : string;
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
function TForm1.StrToHex(const S: string): string;//16진수변환
var
i: Integer;
begin
Result := '';
for i := 1 to Length(S) do
Result := Result + IntToHex( Byte(S[i]), 2 );
end;
procedure TForm1.ComDataPacket1Packet(Sender: TObject; const Str: String);
var
I : Integer;
begin
if (Str = RecvStart) then // 최초 장비로부터 메세지를 받았을 때
begin
ComPort1.WriteStr(SendStart); // 장비와의 ID 체크를 위해 전송한다
end
else if (Str = RecvEnd) then // 장비로부터 종료 메세지를 받았을 때
begin
com_port := ComPort1.Port; // 실제 통신포트 저장 (요부분도 인식하질 않고요.)
Exit; // 끝내면 된다
end
else // 장비ID정보를 받거나 측정데이터를 받았을 때
begin
ComPort1.WriteStr(SendData);
for i := 1 to Length(Str) do
Memo1.Lines.Add('['+IntToStr(i) + '] ' +Str[i] + ' (' + StrToHex(Str[i]) + ')' + ' : ' +
IntTostr(StrToInt('$'+StrToHex(Str[i])))+#13);
Memo1.Lines.Add('-------------');
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
TempReg: TRegistry;
TempStr: TStrings;
I: Integer;
begin
TempReg := TRegistry.Create;
with TempReg do
try
RootKey := HKEY_LOCAL_MACHINE;
if OpenKey('HARDWARE\DEVICEMAP\SERIALCOMM', True) then
begin
TempStr := TStringList.Create;
try
GetValueNames(TempStr);
ListBox1.Clear;
for I := 0 to TempStr.Count-1 do
ListBox1.Items.Add(ReadString(TempStr.Strings[I]));
finally
TempStr.Free;
end;
CloseKey;
end;
finally
Free;
end;
end;
procedure TForm1.Button2Click(Sender: TObject);
var
i : integer ;
cPort : string ;
begin
ComDataPacket1.StartString := #115;
ComDataPacket1.StopString := #170;
com_port := '';
for I := 0 to ListBox1.Items.Count-1 do
begin
ListBox1.ItemIndex := I;
if ComPort1.Connected then
ComPort1.Close;
ComPort1.Port := AnsiString(Listbox1.Items[I]);
ComPort1.BaudRate := br38400;
ComPort1.Open;
if ComPort1.Connected then
begin
ComPort1.WriteStr(SendStart); // 장비와의 ID 체크를 위해 전송한다
if com_port <> '' then // <-- 요부분 인식하지 않음
begin
cPort := TRIM(Listbox1.Items[I]);
Memo1.Lines.Add(cPort);
break;
end;
end;
end;
end;
end.
|