?? com_connect.~pas
字號:
unit COM_CONNECT;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls,ShellApi, SPComm;
type
ByteArray = array [0..0] of byte;
byteall = array[0..10000] of byte;
PpByte = ^ByteArray;
type
TFrmMain=class(TForm)
Memo1: TMemo;
btnSend: TButton;
Button1: TButton;
Memo2: TMemo;
GroupBox1: TGroupBox;
Label1: TLabel;
Label2: TLabel;
ComboBox1: TComboBox;
ComboBox2: TComboBox;
btnSwitch: TButton;
ImageOn: TImage;
ImageOff: TImage;
Comm1: TComm;
procedure FormCreate(Sender: TObject);
procedure ComboBox1Change(Sender: TObject);
procedure btnSendClick(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure ComboBox2Change(Sender: TObject);
procedure btnSwitchClick(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure SendString(const str: string);
procedure Comm1ReceiveData(Sender: TObject; Buffer: Pointer;
BufferLength: Word);
Function ByteToStr(NameArr :Array of byte):String;
function ByteToHex(Src: Byte): String;
private
{ Private declarations }
hhzk : HGlOBAL;
hasc : HGLOBAL;
phzk : PpByte;
pasc : PpByte;
procedure HandleRes;
procedure get_code(str: string);
public
{ Public declarations }
end;
var
frmmain: Tfrmmain;
all : byteall;
implementation
type
ERegError = class(Exception);
{$R *.dfm}
{$R hzk.res}
procedure Tfrmmain.HandleRes;
var
hres : HRSRC;
begin
hres := FindResource(0,PChar(201),'HZK16');
if hres <> 0 then begin
hhzk := LoadResource(0,hres);
if hhzk <> 0 then begin
phzk := LockResource(hhzk);
end;
end;
hres := FindResource(0,PChar(202),'ASC16');
if hres <> 0 then begin
hasc := LoadResource(0,hres);
if hasc <> 0 then begin
pasc := LockResource(hasc);
end;
end;
if (phzk = nil) or (pasc = nil) then begin
MessageDlg('Can not load resource!'#10#13'Program stopped!',
mtWarning,[mbOk],0);
Application.Terminate;
end;
end;
procedure TFrmMain.get_code(str: string);
var
i,j : integer;
m : integer;
leng : integer;
off : integer;
begin
i := 1;
j:=0;
leng := Length(str);
while(i<=leng) do begin
if (i<leng) and boolean(byte(str[i]) and $80)
and boolean(byte(str[i+1]) and $80) then begin
off := ((byte(str[i])-$a1) and $7f) * 94 + ((byte(str[i+1])-$a1) and $7f);
off := off * 32;
//獲取漢字庫點陣代碼 32個字節(jié)
for m:=0 to 31 do begin
all[j]:=phzk^[off+m];
//showmessage(bytetohex(all[j]));
inc(j);
end;
inc(i,2);
end else begin
off := byte(str[i])*16;
//獲取ASC庫點陣代碼 16個字節(jié)
for m:=0 to 15 do begin
all[j]:=pasc^[off+m];
inc(j);
end;
inc(i);
end;
end;
end;
//獲取串口列表
procedure EnumComPorts(Ports: TStrings);
var
KeyHandle: HKEY;
ErrCode, Index: Integer;
ValueName, Data: string;
ValueLen, DataLen, ValueType: DWORD;
TmpPorts: TStringList;
begin
ErrCode := RegOpenKeyEx(HKEY_LOCAL_MACHINE, 'HARDWARE\DEVICEMAP\SERIALCOMM', 0,
KEY_READ, KeyHandle);
if ErrCode <> ERROR_SUCCESS then
raise ERegError.Create('打開串口列表的注冊表項出錯');
TmpPorts := TStringList.Create;
try
Index := 0;
repeat
ValueLen := 256;
DataLen := 256;
SetLength(ValueName, ValueLen);
SetLength(Data, DataLen);
ErrCode := RegEnumValue(KeyHandle, Index, PChar(ValueName),
Cardinal(ValueLen), nil, @ValueType, PByte(PChar(Data)), @DataLen);
if ErrCode = ERROR_SUCCESS then
begin
SetLength(Data, DataLen);
TmpPorts.Add(Data);
Inc(Index);
end
else if ErrCode <> ERROR_NO_MORE_ITEMS then
raise ERegError.Create('打開串口列表的注冊表項出錯');
until (ErrCode <> ERROR_SUCCESS);
TmpPorts.Sort;
Ports.Assign(TmpPorts);
finally
RegCloseKey(KeyHandle);
TmpPorts.Free;
end;
end;
procedure TFrmMain.FormCreate(Sender: TObject);
begin
hhzk := 0;
hasc := 0;
phzk := nil;
pasc := nil;
HandleRes;
//設置窗體的最小大小
FrmMain.Constraints.MinHeight := FrmMain.Height;
FrmMain.Constraints.MinWidth := FrmMain.Width;
btnSend.Enabled:=false;
ImageOff.Visible:=true;
ImageOn.Visible:=false;
//串口初始化
EnumComPorts(ComboBox1.Items); //得到串口列表
ComboBox1.ItemIndex := 0;
Comm1.CommName :=ComboBox1.Text;
ComboBox2.ItemIndex := 2;
Comm1.BaudRate := 9600;
Comm1.Parity := None;
Comm1.ByteSize := _8;
Comm1.StopBits := _1;
end;
procedure TFrmMain.ComboBox1Change(Sender: TObject);
begin
Comm1.CommName := ComboBox1.Text;
end;
procedure TFrmMain.SendString(const str: string);
begin
//get_code(memo1.Text);
//frmmain.comm1.writecommdata(@all[0],sizeof(all));
end;
procedure TFrmMain.btnSendClick(Sender: TObject); //發(fā)送函數(shù)
var
i:integer;
begin
get_code(memo1.Text);
//for i:=1 to length(memo1.text)*16 do begin
frmmain.comm1.writecommdata(@all[0],length(memo1.text)*16);
//sleep(2);
//showmessage(bytetostr(all[i]));
//showmessage('ok');
end;
procedure TFrmMain.Button1Click(Sender: TObject);
begin
close;
end;
procedure TFrmMain.ComboBox2Change(Sender: TObject);
begin
comm1.BaudRate :=StrToInt(comboBox2.text);
end;
procedure TFrmMain.btnSwitchClick(Sender: TObject);
begin
//判斷按鍵的狀態(tài)可以避免打開串口出錯時,要按兩次按鍵
if btnSwitch.Caption = '打開串口' then
begin
Comm1.StartComm; //打開串口
btnSwitch.Caption := '關閉串口';
ComboBox1.Enabled := false;
btnSend.Enabled := true;
ComboBox2.Enabled :=false;
ImageOff.Visible := false;
ImageOn.Visible := true;
end
else //if Button1.Caption = '關閉串口' then
begin
Comm1.StopComm; // 關閉串口
btnSwitch.Caption := '打開串口';
ComboBox1.Enabled := true;
ComboBox2.Enabled := true;
btnSend.Enabled := false;
ImageOn.Visible := false;
ImageOff.Visible := true;
end;
end;
procedure TFrmMain.FormDestroy(Sender: TObject);
begin
if hhzk <> 0 then FreeResource(hhzk);
if hasc <> 0 then FreeResource(hasc);
end;
procedure TFrmMain.Comm1ReceiveData(Sender: TObject; Buffer: Pointer;
BufferLength: Word);
var s:string;
begin
setlength(s,bufferlength);
move(buffer^,s[1],bufferlength);
Memo2.Lines.Add(s);
end;
Function tfrmmain.ByteToStr(NameArr :Array of byte):String;
var I:Integer;
S:String;
Begin
Setlength(S,High(NameArr)+1);
For I:=Low(NameArr) to High(NameArr) do S[I+1]:=Char(NameArr[I]);
Result :=Pchar(S);
End;
function tfrmmain.ByteToHex(Src: Byte): String;
begin
SetLength(Result, 2);
asm
MOV EDI, [Result]
MOV EDI, [EDI]
MOV AL, Src
MOV AH, AL // Save to AH
SHR AL, 4 // Output High 4 Bits
ADD AL, '0'
CMP AL, '9'
JBE @@OutCharLo
ADD AL, 'A'-'9'-1
@@OutCharLo:
AND AH, $f
ADD AH, '0'
CMP AH, '9'
JBE @@OutChar
ADD AH, 'A'-'9'-1
@@OutChar:
STOSW
end;
end;
end.
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -