如何判断串口打开,接收串口数据,比如刷卡!我用SPCOMM控件,具体点!
解决方案 »
- 怎样连接使用了带特殊符号密码的ACCESS数据库??
- 挑戰極限:800X600無損縮放到320X240最短時間!
- 三层传递图片(在线等候)
- 怎样创建这样的一个视图?
- 这里有谁写共享软件收到过用户主动寄来的注册费吗?
- 新手请问大家一个简单的问题?枚举问题。
- 一个小问题
- 高手请进
- 要在客户端IE中运行ACTIVEFORM除了降低IE的安全级别外,还有什么方法?(不好意思!分数不多了!)
- 用Query查询时查询条件用string类型和Tdate类型用什么区别???
- indy 的TidTCPServer在connect事件中怎样获取当前连接客户端的IP?解决了马上给分!
- listbox中的每一项显示一个值,实际取得一个值,如何作???
spcomm1.open;
except
showmessage('该端口已打开!');
end;
接收事件需要使用SPCOMM控件的RECEIVEDATA事件,当有数据到来时,此事件自动被触发.
procedure TFrmKQJ.Comm1ReceiveData(Sender: TObject; Buffer: Pointer;
BufferLength: Word);
var
ReceiveBuf:array[0..300] of byte;//接收缓存
ReceiveBufIndex:integer;//接收到的字节数
begin
//将接收到的数据从SPCOM控件缓冲区复制到ComBuf
move(Buffer^,ReceiveBuf,Bufferlength);
ReceiveBufIndex:=Bufferlength;
END;
//将接收到的数据从SPCOM控件缓冲区复制到ComBuf
应该是:
//将接收到的数据从SPCOM控件缓冲区复制到ReceiveBuf
......
ICommControl = interface
['{E81C3798-1F80-4586-A4DD-122584A8FF1A}']
function CommInit: Integer;
function CommWrite(var WriteData: string;
NumberofBytesToWrite: DWord;
PurgeFlag: Boolean;
TimeOut: DWord): Integer;
function CommRead(var ReadData: string;
var TotalBytes: Integer;
NumberOfBytesToRead: DWord;
PurgeFlag: Boolean;
TimeOut: DWord): Integer;
procedure CommPurge(const RWFlag: Integer);
end;...... TCommControl = class(TInterfacedObject, ICommControl)
private
FCommPort: Integer;
FHandle: DWord;
FOpened: Boolean;
protected
function OpenComm: Integer;
function CloseComm: Integer;
Procedure SetComm;
//ICommControl
function CommInit: Integer;
function CommWrite(var WriteData: string;
NumberofBytesToWrite: DWord;
PurgeFlag: Boolean;
TimeOut: DWord): Integer;
function CommRead(var ReadData: string;
var TotalBytes: Integer;
NumberOfBytesToRead: DWord;
PurgeFlag: Boolean;
TimeOut: DWord): Integer;
procedure CommPurge(const RWFlag: Integer);
public
constructor Create(const CommPort: Integer);
destructor Destroy; override;
end;(FOpened没有对外,是私有域,如果有必要,你可以公布在ICommControl中)下面只公布OPENCOMM(因为全部公布太长了)
function TCommControl.OpenComm: Integer;
var
sCommPort:String;
dwShareMode:DWord;
begin
sCommPort:='\\.\COM'+IntToStr(FCommPort); if FOpened Then
begin
Result := -102;
Exit;
end; dwShareMode := 0; FHandle := Windows.CreateFile(PChar(sCommPort),
GENERIC_READ or GENERIC_WRITE,
dwShareMode,
nil,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
0); if FHandle = INVALID_HANDLE_VALUE then
begin
Result := -101;
Exit;
end; SetComm;
FOpened := True;
Result := 0;
end;
发送AT触发receviedata事件