Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Программирование Com-порта под WinNT


AngelOfDarkness ©   (2004-08-16 17:34:00) 

Доброго времени суток. Проблема такая. Написал прогу (не без помощи этого сайта) по передаче данных в com-порт. Вот листинг модуля

unit PortUnit;
interface
uses Windows, SysUtils;
var
 KolByte:DWord;
 ComHandle:THandle;
 DCB : TDCB;
function InitCPort(PortName:PChar):boolean;
procedure KillCPort;
function WriteCPort(SendStr:string):boolean;

implementation
function InitCPort(PortName:PChar):boolean;
var
res:boolean;
begin
 res:=true;
 ComHandle:=CreateFile(PortName,
                       GENERIC_READ or GENERIC_WRITE,
                       0,
                       nil,
                       OPEN_EXISTING,
                       FILE_ATTRIBUTE_NORMAL or FILE_FLAG_OVERLAPPED,
                       0);
 if ComHandle=INVALID_HANDLE_VALUE then res:=false;
 if res then begin
 SetCommMask(ComHandle,EV_RXFLAG);
 GetCommState(ComHandle,DCB);
 DCB.BaudRate:=CBR_9600;
 DCB.Parity:=NOPARITY;
 DCB.ByteSize:=8;
 DCB.StopBits:=OneStopBit;
 DCB.EvtChar:=chr(13);
 SetCommState(ComHandle,DCB);
 PurgeComm(ComHandle,PURGE_TXCLEAR or PURGE_RXCLEAR);
 end;
 InitCPort:=res;
end;

procedure KillCPort;
begin
 CloseHandle(ComHandle);
end;

function WriteCPort(SendStr:string):boolean;
var
 SendByte:array[0..255] of char;
 KolByteW:DWord;
 res:boolean;
begin
 KolByte:=1;
 SendByte[0]:=chr(StrToInt(SendStr));
 WriteFile(ComHandle,SendByte,KolByte,KolByteW,nil);
 if KolByte=KolByteW then res:=true
                     else res:=false;
 WriteCPort:=res;
end;

end.


Под операционкой Win98 все работает, т.е. осциллограф, присоединенный ко 2 и 5 ногам порта подает признаки жизни :)
А вот с W2k начитаются проблемы. В функции WriteCPort значения переменных KolByte и KolByteW не совпадают.
Если кто сможет объяснить в чем дело, буду очень признателен.


jack128   (2004-08-16 23:23:00) [1]

вот только заливать не надо, а?
Сopy - Paste из статьи
KolByte:=1;
Transmit[0]:=chr(A);
WriteFile(CommHandle,Transmit,KolByte,KolByte, @Ovr);


AngelOfDarkness   (2004-08-16 18:47:00) [2]

Огромное спасибо. Все заработало после удаления флага FILE_FLAG_OVERLAPPED. Просто я все делал по примеру со страницы http://www.delphimaster.ru/articles/comport2/index.html#PageTop, а там именно так написано.


jack128   (2004-08-16 17:47:00) [3]

простейший путь для тебя убрать флаг FILE_FLAG_OVERLAPPED
и еще написать Win32Check(WriteFile(ComHandle,SendByte,KolByte,KolByteW,nil));


jack128   (2004-08-16 17:42:00) [4]

Если чесно мне странно, почему это в Win9x работает.. Учитывая
> CreateFile(PortName,
>                        GENERIC_READ or GENERIC_WRITE,
>                        0,
>                        nil,
>                        OPEN_EXISTING,
>                        FILE_ATTRIBUTE_NORMAL or FILE_FLAG_OVERLAPPED,
>                        0)

и


> WriteFile(ComHandle,SendByte,KolByte,KolByteW, nil);


Наверх

Титульная страница Поиск, карта сайта Написать письмо