Форум: "Система";
Текущий архив: 2003.02.10;
Скачать: [xml.tar.bz2];
Внизиспользовние 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;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.011 c