Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.02.10;
Скачать: CL | DM;

Вниз

использовние COM-порта под Windows NT   Найти похожие ветки 

 
McAndy   (2002-11-22 13:26) [0]

Подскажите кто знает, чем отличается работа с последовтельными портами под 98 и под NT? Я пользуюсь CreateFile и ReadFile, и у меня под 98 все работает, а под NT нет.


 
Marcus   (2002-11-22 13:38) [1]

Мало данных. Нужен фрагмент кода. Одно могу сказать, работа с портами ничем не отличается для этих двух ОС, скорей всего недочеты в коде, на которые 98 "смотрит сквозь пальцы", а НТ не пропускает


 
McAndy   (2002-11-22 13:52) [2]

Marcus, делаю я таким образом:

//открытие порта
Handle_COM:=CreateFile(NPort,
GENERIC_READ or GENERIC_WRITE,0,NIL,
OPEN_EXISTING,FILE_FLAG_OVERLAPPED,0);
if Handle_COM<>INVALID_HANDLE_VALUE then
begin
//установка прмеметров
Res:=GetCommState(Handle_COM,DCB_COM);
with DCB_COM do begin
val(optionsdlgform.optsp.text,BaudRate,code);
ByteSize:=optionsdlgform.optbinb.Value;
Parity:=optionsdlgform.Events.ItemIndex;
StopBits:=optionsdlgform.optstopbit.ItemIndex;
end;
Res:=SetCommState(Handle_COM,DCB_COM);

if Res then
begin
//установка буферов
val(optionsdlgform.optinb.text,vsp,code);
val(optionsdlgform.optoutb.text,vsp1,code);
if SetupComm(Handle_COM,vsp,vsp1) then
begin
//----------очистка
ClearCommError(Handle_COM,Errors,@COM_Stat);
if COM_Stat.cbInQue<>0 then
ReadFile(Handle_COM,buf,COM_Stat.cbInQue,CountReadBytes,OverLappedCOM);
end;

Далее по таймеру считывю данные
Result:=false;
try
CountReadBytes:=0;
L:=SizeBufDataUGI+2;
ClearCommError(Handle_COM,Errors,@COM_Stat);
if COM_Stat.cbInQue < 2*L then Exit;
//это чисто под мою задачу
{обеспечение синхронизации}
Data1:=$00;
k:=0;
while (Data1<>$0AA) and (k<=L-1) do begin
ClearCommError(Handle_COM,Errors,@COM_Stat);
ReadFile(Handle_COM,Data1,1,b2,OverLappedCOM);
Inc(k);
end;
if k>=L-1 then Exit;
ClearCommError(Handle_COM,Errors,@COM_Stat);
ReadFile(Handle_COM,Data1,1,b2,OverLappedCOM);
if Data1 = $055 then begin {считывание данных}
ClearCommError(Handle_COM,Errors,@COM_Stat);
if COM_Stat.cbInQue >= SizeBufDataUGI then
ReadFile(Handle_COM,BufDataUGI,SizeBufDataUGI,
CountReadBytes,OverLappedCOM);
end;
if CountReadBytes = SizeBufDataUGI then Result:=true;
except
raise
end;


 
Marcus   (2002-11-22 14:07) [3]

А в каком месте ошибка и каков ее код (GetLastError)? Меня смущает FILE_FLAG_OVERLAPPED. Обычно асинхронный ввод/вывод используется для чтения/записи в другом потоке, а сообщения от таймера WM_TIMER направляются в основной, здесь нет смысла в OverlappedCOM, можно просто
ClearCommError(Handle_COM, Errors, @comst);
if(comst.cbInQue <> 0) then begin
ReadFile(Handle_COM, Data1, comst.cbInQue, b2, NIL);

В ReadFile размер лучше указывать не явно "1", а comst.cbInQue


 
Sir DAMM   (2002-12-05 13:46) [4]

2Marcus: FILE_FLAG_OVERLAPPED под WinNT/2k/XP должен присутствоват для COM портов в обезловке.


 
Marcus   (2002-12-05 14:47) [5]

> Sir DAMM

У меня есть работающее приложение, которое юзает порт под любой ОС без этого флага и работает при этом без ошибок


 
Evgeny V ©   (2002-12-06 07:07) [6]

Об FILE_FLAG_OVERLAPPED - не обязательно,но уж если ты используешь этот флаг и читаешь из порта ипользуя этот метод, то для начала было бы неплохо объявить OVERLAPPED OverLappedCOM создать Event, т.е.OverLappedCOM.hEvent=CreateEvent(NULL,true, false,NULL);(извини пишу на си, так что синтаксис фильтруй), для операций записи и чтения можно создать разные OVERLAPPED структуры(Record в дельфи), а у тебя в коде я этого не увидел. Вообще в хелпе дельфи по WinSdk не плохо написано, даже с примерами кода, только надо поискать.Удачи, у меня в первый раз было то же самое. Просто NT более критична к таким недочетам, если на NT работает, то будет в 98 (ну если не используешь функций специфичных только для NT), а вот наоборот не всегда.


 
Evgeny V ©   (2002-12-06 07:18) [7]

Да забыл добавить, при работе с OVERLAPPED работа вообще строится не так, используется OVERLAPPED WaitForSingleObject или WaitForMultipleObjects, а ReadFile возвращается немедленно, в хелпе нормальный пример посмотри, и подумай о том, чтобы выкинуть работу с портом в отдельный поток, хоть и не обязательно, но на мой взгляд желательно. Ну а можешь глянуть готовые компоненты на www.torry.net в разделе vcl, communication, ports and modem. Я пользуюсь CPort261, смотрел его исходники, ну очень не плохо, мне нравится.


 
Одессит   (2002-12-06 11:51) [8]

Мне тоже надо было найти компоненту для СОМ порта для связи с кассовым аппаратом. Всё перерыл, всё плохо работало.
Нашел свободную компоненту этого человека Victor Chen и кажись на torry. Где надо для себя подправил (благо с исходниками) и теперь всё работает как надо.



Страницы: 1 вся ветка

Текущий архив: 2003.02.10;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.023 c
1-28796
Anton Tsvilikh
2003-02-01 21:35
2003.02.10
ПОЧЕМУ НЕ ХЧЕТ РИСОВАТЬ?????


3-28596
Niger
2003-01-21 16:44
2003.02.10
Invalid variant type conversion


1-28899
Zirus
2003-01-30 06:08
2003.02.10
TabControl1


1-28723
Ihtiandr
2003-01-31 17:25
2003.02.10
Минимальный размер формы


14-29079
Zhenka
2003-01-25 15:30
2003.02.10
Ув Мастера кто работал с ф-ей SHAddToRecentDocs