unit Mainfrm;interfaceuses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
SPComm, StdCtrls, ComCtrls;type
TfrmComm = class(TForm)
MmoComm: TMemo;
EdtCommName: TEdit;
EdtBaudRate: TEdit;
CmbByteSize: TComboBox;
CmbParity: TComboBox;
CmbStopBits: TComboBox;
lbl1: TLabel;
lbl2: TLabel;
lbl3: TLabel;
lbl4: TLabel;
lbl5: TLabel;
stat1: TStatusBar;
EdtSendText: TEdit;
lbl6: TLabel;
BtnOpen: TButton;
BtnSend: TButton;
btnClose: TButton;
Comm: TComm;
procedure FormCreate(Sender: TObject);
procedure BtnOpenClick(Sender: TObject);
procedure btnCloseClick(Sender: TObject);
procedure BtnSendClick(Sender: TObject);
procedure CommReceiveData(Sender: TObject; Buffer: Pointer;
BufferLength: Word);
procedure EdtBaudRateExit(Sender: TObject);
procedure CmbByteSizeChange(Sender: TObject);
procedure CmbStopBitsChange(Sender: TObject);
procedure CmbParityChange(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;var
frmComm: TfrmComm;implementation{$R *.DFM}
//³õʼ»¯ÐÅÏ¢
procedure TfrmComm.FormCreate(Sender: TObject);
begin
EdtCommName.Text :='COM1';
EdtBaudRate.Text :='9600';
CmbByteSize.ItemIndex :=3;
CmbParity.ItemIndex :=0;
CmbStopBits .ItemIndex :=0;
end;
//´ò¿ª¶Ë¿Ú
procedure TfrmComm.btnOpenClick(Sender: TObject);
begin
//ÉèÖô®¿Ú²ÎÊý
comm.CommName := edtCommName.Text;
comm.BaudRate := strToInt(edtBaudRate.Text);
comm.ByteSize := TByteSize(cmbByteSize.ItemIndex);
comm.StopBits := TStopBits(cmbStopBits.ItemIndex);
comm.Parity := TParity(cmbParity.ItemIndex);
//´ò¿ª´®¿Ú
try
Comm.StartComm;
except
raise Exception.Create('´ò¿ª´®¿Ú´íÎó');
end;
stat1.Panels[0].Text := Comm.CommName + 'ÒÑ´ò¿ª';
stat1.Refresh;
btnOpen.Enabled := False;
btnSend.Enabled := True;
btnClose.Enabled := True;
end;
//¹Ø±Õ´®¿Ú
procedure TfrmComm.btnCloseClick(Sender: TObject);
begin
Comm.StopComm;
self.stat1.Panels[0].Text := Comm.CommName + 'ÒѹرÕ';
stat1.Refresh;
end;
//·¢ËÍÏûÏ¢
procedure TfrmComm.BtnSendClick(Sender: TObject);
var
str: Pchar;
Count: integer;
begin
str := Pchar(EdtSendText.Text);
Count := Length(str);
if Comm.WriteCommData(str, Count) then
mmoComm.Lines.Add('ÒÑ·¢ËÍ' + intTostr(Count) + '¸ö×Ö·û')
else
raise exception.Create('·¢ËÍ´íÎó');
end;
//´®¿Ú½ÓÊÕÊý¾Ý
procedure TfrmComm.CommReceiveData(Sender: TObject; Buffer: Pointer;
BufferLength: Word);
var
strRecv : string;
begin
setLength(strRecv,BufferLength);
Move(Buffer^,pchar(strRecv)^,BufferLength);
mmoComm.Lines.Add('ÒÑÊÕµ½£º'+intTostr(BufferLength)+'×Ö½ÚµÄÊý¾Ý');
mmoComm.Lines.Add(strRecv);
mmoComm.Invalidate ;
end;
//ÑéÖ¤²¨ÌØÂÊ
procedure TfrmComm.EdtBaudRateExit(Sender: TObject);var
i: integer;
begin
try
i := strToInt(edtBaudRate.Text)
except
edtBaudRate.setfocus;
raise Exception.Create('²¨ÌØÂÊÉèÖôíÎó');
end;
//¸Ä±ä´®¿ÚµÄ²¨ÌØÂÊ
comm.BaudRate := StrToInt(edtBaudRate.Text);end;procedure TfrmComm.CmbByteSizeChange(Sender: TObject);
begin
//¸Ä±ä´®¿ÚµÄÊý¾Ýλ
comm.ByteSize := TByteSize(cmbByteSize.ItemIndex);
end;procedure TfrmComm.CmbStopBitsChange(Sender: TObject);
begin
//¸Ä±ä´®¿ÚµÄֹͣλ
comm.StopBits := TStopBits(cmbStopBits.ItemIndex);
end;procedure TfrmComm.CmbParityChange(Sender: TObject);
begin
//ÉèÖô®¿ÚµÄÆæżУÑéλ
comm.Parity := TParity(cmbParity.ItemIndex);
end;end.
我在两台台式机上试,无法打开端口请问哪位大大帮忙看下!
解决方案 »
- 如何将Excel中的数据复制粘贴到DBGridEH中?
- delphi用什么数据库?
- Tchart上如何随鼠标显示相应图像的数值
- 请问如何在Delphi中挂上自己的菜单,再又如何在Delphi中按 Ctrl+U 等快捷键就能跳出自己做的程序
- 一个dataset容量的问题,急
- 怎么样对用户的权限的进行设置呀??
- 拦截系统快捷键
- 泣血跪求超难算法。。。。高手有请!!!
- 完全控制WAV的播发,比如播发的次数等,该怎么做呢?
- 怎样进行企业的软件规划?(热门话题:答者给分除什么"up""关注"之类的话,分不够加分)
- 有没有人能告诉我在哪能找到Delphi的一些好用的第三方控件啊!?
- 请问Formula One可以动态加载Excel文件吗?
我看源程序只有下拉框可能出现这个错误,可是也没有什么错误呀!
comm.StopBits := TStopBits(cmbStopBits.ItemIndex);估计这个越界了,-1...n
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;列举本机可用串口