[an error occurred while processing this directive]
Понятно :-) (+)
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)

миниатюрный аудио-видеорекордер mAVR

Отправлено misyachniy 16 ноября 2006 г. 15:13
В ответ на: Пытался убирать DTR, но при этом модем вырубается, передача сигналов управления на комп вроде реализована через второй эндпоинт, но какаято совсем тормознутая - пока откликнится на снятие CTS уже весь буфер забит. отправлено F8 16 ноября 2006 г. 13:59


Нужно правильно пи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;
//-------------------------------------
Таким образом если записали в порт, а порт занят, программа не виснет. Или дали запрос на чтение а данных нет.
По моему должна быть и функция отказа от записи/чтения но не буду утверждать :-)



Составить ответ  |||  Конференция  |||  Архив

Ответы


Отправка ответа
Имя (обязательно): 
Пароль: 
E-mail: 

Тема (обязательно):
Сообщение:

Ссылка на URL: 
URL изображения: 


Rambler's Top100 Рейтинг@Mail.ru
Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание