如何实现对并口的异步操作(200分)

  • 主题发起人 主题发起人 0738
  • 开始时间 开始时间
0

0738

Unregistered / Unconfirmed
GUEST, unregistred user!
注意:是并口,不是串口,代码如下
procedure TfrmMain.btnSendDataClick(Sender: TObject);
var
NumOfSended,NumOfSend,NumOfSending: DWord;
Err: DWord;
SendData: PChar;
Send_Os: TOverlapped;
hSend: THandle;
begin
NumOfSending := 0;
NumOfSended := 0;
SendData := 'aaaa';
NumOfSend := Length(SendData);

hSend := CreateFile('LPT1', GENERIC_WRITE, 0,nil, OPEN_EXISTING,
FILE_FLAG_OVERLAPPED, 0);
FillChar(Send_Os, SizeOf(Send_Os), 0);
Send_Os.hEvent := CreateEvent(nil, True, False, nil);
SetCommMask(hSend, EV_TXEMPTY); //并口好像不支持此过程????
repeat
// 发送通讯数据
if not WriteFile(hSend,SendDat[NumOfSending],NumOfSend,
NumOfSended,@Send_Os) then begin
Err := GetLastError;
if Err <> 0 then begin
if Err = ERROR_IO_PENDING then begin
WaitForSingleObject(Send_Os.hEvent, INFINITE);
GetOverlappedResult(hSend, Send_Os, NumOfSended, False);
end else
raise Exception.Create('发送数据失败');
end;
end;
Dec(NumOfSend, NumOfSended);
Inc(NumOfSending, NumOfSended);
until (NumOfSend <= 0);
end;

因为并口不支持SetCommMask,导致WaitForSingleObject无法返回,如果设置了
WaitForSingleObject的超时参数的话,结果一个字符都没有发送出去
 
可以找三方控件试试,API比较费时费力,不过能学到东西,呵呵。
 
你换一种方式?直接对端口操作,输出数据。
有在NT环境进行端口的控件。
 
2000下不能直接对端口操作,除非有ring0权限,或者用别人的驱动
 
你需要的输出速度是多少?如果不是特别高,我给你win2000的端口操作控件。
 
zywcd: 谢谢,对速度没有特别要求
我的email 0738@21cn.com
 
mark 一下,也许我也要用到
 
后退
顶部