Форум: "Система";
Текущий архив: 2003.07.24;
Скачать: [xml.tar.bz2];
ВнизМастера, помогите снять информацию с сom порта Найти похожие ветки
← →
Скела (2003-05-11 23:37) [0]Суть такая: спаяно устройство для управления пультом ДУ, которое точно работает(проверено на многих програмках). Проблема следующая надо снять информацию с сom порта при нажатии клавиши на пульте; ниже приведена программа, которая только ловит событие (нажата ли клавиша), но никак не хочет читать код на входе CTS или DCD. Помогите очень надо! Спасибо!
procedure TForm1.FormCreate(Sender: TObject);
var fSuccess: LongBool;
state: DCB;
prop: COMMPROP;
begin
hCom := CreateFile(
PChar("COM2"),
GENERIC_READ or GENERIC_WRITE,
0,
nil,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL or FILE_FLAG_OVERLAPPED,
0);
if hCom = INVALID_HANDLE_VALUE then
begin
// Handle the error.
end;
fSuccess := SetCommMask(hCom, {EV_BREAK or }EV_CTS {or EV_DSR or EV_ERR or EV_RING or
EV_RLSD {or EV_RXCHAR or EV_RXFLAG or EV_TXEMPTY});
//построение DCB
GetCommState(hCom, state);
state.BaudRate := CBR_9600;
state.Parity := NOPARITY;
state.ByteSize := 8;
state.StopBits := OneStopBit;
state.EvtChar := chr(13);//задание символа для флага
//устанавливаем DCB
SetCommState(hCom, state);
{fSuccess := GetCommState(hCom, state);
state.Flags := (DTR_CONTROL_ENABLE shl 4) or (DTR_CONTROL_HANDSHAKE shl 4)
or (RTS_CONTROL_HANDSHAKE shl 12) or (RTS_CONTROL_ENABLE shl 12);
state.Parity := EVENPARITY;
fSuccess := SetCommState(hCom, state);}
//GetCommProperties(hCom, prop);
//SetCommProperties(hCom, prop);
ZeroMemory(@osStatus, SizeOf(OVERLAPPED));
osStatus.hEvent := CreateEvent(
nil, // no security attributes
True, // auto reset event
False, // not signaled
nil // no name
);
//SetupComm(hCom, 1024, 1024);
fThreadDone := False;
ReadCom := TThread1.Create(False);
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
fThreadDone := True;
CloseHandle(osStatus.hEvent);
CloseHandle(hCom);
end;
procedure TThread1.Execute;
var lpBuf: array [0..1023] of Byte;
begin
while not fThreadDone do
begin
{if not fWaitingOnStat then
begin}
dwCommEvent := 0;
{if not }WaitCommEvent(hCom, dwCommEvent, @osStatus); {then}
//begin
if (dwCommEvent and EV_RXFLAG) = EV_RXFLAG then
begin
ClearCommError(hCom, Errs, @Stat);//сбрасываем флаг
dwRead := Stat.cbInQue;
ReadFile(hCom, lpBuf, dwRead, dwRead, @osStatus);//читаем
end
else if dwCommEvent <> 0 then
begin
dwRead := 0;
ClearCommError(hCom, Errs, @Stat);//сбрасываем флаг
dwRead := Stat.cbInQue;
dwRead := 1;
ReadFile(hCom, lpBuf, dwRead, dwRead, @osStatus);//читаем
getb(b,ok);
if dwRead <> 0 then
dwRead := 0;
end;
end;
end;
end.
← →
Verg (2003-05-12 11:16) [1]
> osStatus.hEvent := CreateEvent(
> nil, // no security attributes
> True, // auto reset event
> False, // not signaled
> nil // no name
> );
Надо заводить signaled:
CreateEvent(nil, true, true, nil);
Далее, алгоритм:
1. WaitCommEvent(hCom, dwCommEvent, @osStatus);
2. Ждем osStatus.hEvent
3. Дождавшись, делаем GetOverlappedResult
4. Только если п.3 прошел без ошибки, обрабатываем на свое усмотрение dwCommEvent и переходим к п.1
5. Если п.3 вернул GetLastError=ERROR_OPERATION_ABORTED переходим к п.1
← →
Verg (2003-05-12 11:24) [2]Да кстати, WaitCommEvent может вернуть ошибку GetLastError=ERROR_IO_PENDING - это нормально
Вот кусок кода, может пригодиться;
procedure DoCommEvent;
label L1;
var Dummy : DWORD;
begin
if GetOverlappedResult(HCommFile, EventOv, Dummy, false) then
begin
GetCommModemStatus(HCommFile, FModemStatus);
if EvMask and EV_ERR<>0 then
ClearCommError(HCommFile, MdErrors, FCommStat)) else MdErrors:=0;
HandleEvent;
L1:
if not WaitCommEvent(HCommFile, EvMask, @EventOv) then
if GetLastError<>ERROR_IO_PENDING then Terminate else SetLastError(0);
end else
if GetLastError=ERROR_OPERATION_ABORTED then
begin
SetLastError(0);
goto l1;
end else Terminate;
end;
begin
if not WaitCommEvent(HCommFile, EvMask, @EventOv) then
if GetLasterror<>ERROR_IO_PENDING then Terminate else SetLastError(0);
while not Terminated do
Case WaitForObjects([ExitEvent, EventOv.HEvent], INFINITE, false) of
WAIT_OBJECT_0 :Terminate;
WAIT_OBJECT_0+1: DoCommEvent;
end;
end;
← →
Soft (2003-05-13 15:38) [3]14 Мб и все что работает с COM или LPT подключается 1 кликом мышки:)
http://sourceforge.net/projects/tpapro/
← →
MBo (2003-05-14 07:53) [4]>Soft
у TurboPower вроде бы компонентов для общения с LPT не было, только COM, или я ошибаюсь?
← →
MegaVolt (2003-05-14 09:38) [5]Я читал так:
GetCommModemStatus(hCommFile,i);
if (i and MS_CTS_ON)<>0
then Label1.Caption:="CTS 1"
else Label1.Caption:="CTS 0";
И по аналогии для любых других входных сигналов. Читаю по таймеру просто для индикации но если нужно можно читать в любой момент времени.
Страницы: 1 вся ветка
Форум: "Система";
Текущий архив: 2003.07.24;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.007 c