Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Система";
Текущий архив: 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
1-77828
Joker
2003-07-10 22:54
2003.07.24
Как изменить цвет главного меню?


1-77961
MakNik
2003-07-11 09:54
2003.07.24
StatusBar


6-78020
xShadow
2003-05-19 15:22
2003.07.24
Имя удалённого пользователя .....


3-77725
boka
2003-06-27 09:24
2003.07.24
Как из txt перебросить данные в dbf


1-77884
Александр М.
2003-07-14 02:23
2003.07.24
Картинка на рабочем столе





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский