Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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.48 MB
Время: 0.066 c
1-1094541629
KIR
2004-09-07 11:20
2004.09.26
Народ, кто уже работает с D8?


1-1095061651
kukuikar
2004-09-13 11:47
2004.09.26
Как FlashGet или Net Transport


3-1093416778
Koala
2004-08-25 10:52
2004.09.26
Как отловить Exception


3-1093979991
Morrison
2004-08-31 23:19
2004.09.26
Как узнать значение autoincrement поля без ApplyUpdates?


3-1093497986
RDen
2004-08-26 09:26
2004.09.26
Как использовать транзакцию при работе с несколькими таблицами?