Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Система";
Текущий архив: 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.01 c
3-28624
AnatoliJ
2003-01-14 02:19
2003.02.10
Pomogite mne please v DBGrid programno zapisat dannije


14-29009
gn
2003-01-23 06:42
2003.02.10
А вообще кто вочто верит


6-28962
umr
2002-12-14 08:44
2003.02.10
как можно найти MAC адрес удаленного компьютера


1-28716
laza
2003-01-30 00:11
2003.02.10
помогите с кодом. Есть приложение. его главная форма скрыта


1-28706
DiXO
2003-01-31 14:47
2003.02.10
Как сделать DBGrid пустым???





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский