[an error occurred while processing this directive]
|
Нужно правильно пиcать/читать.
То есть использовать ассинхронный ввод/вывод.Я с USB работал так(приведу пример только записи):
ReadOverlapped:tOverlapped; // Структура для асинхронного чтения
WriteOverlapped:tOverlapped; // Структура для асинхронной записиОткрытие файла(COM порта в вашем случае).
// ---------------------------------------------------------
function OpenPipe(s:string;ReadOrWrite:dword): tHANDLE;
var tmp:tHandle;
TryCount:dword;
dwLastError:dword;
begin
TMP:=Invalid_handle_value;
TryCount:=10;
while (tmp=Invalid_handle_value) and (TryCount>0) do
begin
tmp:=CreateFile(PChar(s),
ReadOrWrite,
0,
nil,
OPEN_EXISTING,
FILE_FLAG_OVERLAPPED,
0);
dec(TryCount);
dwLastError:= GetLastError();
if tmp=Invalid_handle_value then sleep(100);
end;
if TMP=Invalid_handle_value then
CriticalError('Ошибка открытия :'+S+'!');
result:=tmp;
end;
//---------------------------------Асинхронная запись с проверкой результата (getOverlappedResult)
//---------------------------------
function WritePipe(H:tHandle;P:pointer;B:dword; S:string):boolean;
var NumberOfByteTransfered:dword;
StopOperation:dword;
Succ:boolean;
begin
WriteFile(
h, // handle to file to write to
P^, // pointer to data to write to file
b, // сколько писать
NumberOfByteTransfered, // сколько реально прописали
@WriteOverlapped // pointer to structure needed for overlapped I/O
);
succ:=false;
while not Succ do
begin
if b >16 then StopOperation:=GetTickCount+50000*TimeLonger
else StopOperation:=GetTickCount+100000*TimeLonger;
Inc(TimeLonger); // прибавяем по 5 или 10 секунд. При записи 27512 и 27с8000 может понадобитсяwhile (not getOverlappedResult(h, WriteOverlapped, NumberOfByteTransfered,true))
and(StopOperation>GetTickCount) do Sleep(10);
if NumberOfByteTransfered < b then
begin
if CriticalExecution('В USB не записано :'+IntToStr(B-WritedByte)+' байт!')= mrAbort
then Halt;
end
else succ:=true;end; //while not Succ do
result:=true;
end;
//-------------------------------------
Таким образом если записали в порт, а порт занят, программа не виснет. Или дали запрос на чтение а данных нет.
По моему должна быть и функция отказа от записи/чтения но не буду утверждать :-)