Текущий архив: 2004.09.26;
Скачать: CL | DM;
ВнизПрограммирование Com-порта под WinNT Найти похожие ветки
← →
AngelOfDarkness © (2004-08-16 17:34) [0]Доброго времени суток. Проблема такая. Написал прогу (не без помощи этого сайта) по передаче данных в 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 17:42) [1]Если чесно мне странно, почему это в 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);
← →
jack128 © (2004-08-16 17:47) [2]простейший путь для тебя убрать флаг FILE_FLAG_OVERLAPPED
и еще написать Win32Check(WriteFile(ComHandle,SendByte,KolByte,KolByteW,nil));
← →
AngelOfDarkness © (2004-08-16 18:47) [3]Огромное спасибо. Все заработало после удаления флага FILE_FLAG_OVERLAPPED. Просто я все делал по примеру со страницы http://www.delphimaster.ru/articles/comport2/index.html#PageTop, а там именно так написано.
← →
jack128 © (2004-08-16 23:23) [4]вот только заливать не надо, а?
Сopy - Paste из статьи
KolByte:=1;
Transmit[0]:=chr(A);
WriteFile(CommHandle,Transmit,KolByte,KolByte,@Ovr);
Страницы: 1 вся ветка
Текущий архив: 2004.09.26;
Скачать: CL | DM;
Память: 0.45 MB
Время: 0.051 c