![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Программирование 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);