Comm Port (Программирование Comm Port-ов)

  • Автор темы xsaser
  • Дата начала
Статус
Закрыто для дальнейших ответов.
X

xsaser

#1
Народ помогите с программированием comm port-ов
суть идеи такая на ком порт должно подаваться сигнал точнее говоря напряжение от 1-5В
Если напряжение поступило на ком порт то допустим надо выдать сообщение если нет то не че не делать
Вот мне не понятно как в Делфи вот это самое написать
и не так важное новсе таки к каким пинам подключать что он принял
Пожалуйста помогите
Заранее благодарен
 
S

Shurik Ilyin

#2
Народ помогите с программированием comm port-ов
суть идеи такая на ком порт должно подаваться сигнал точнее говоря напряжение от 1-5В
Если напряжение поступило на ком порт то допустим надо выдать сообщение если нет то не че не делать
Вот мне не понятно как в Делфи вот это самое написать
и не так важное новсе таки к каким пинам подключать что он принял
Пожалуйста помогите
Заранее благодарен
1.
Сам не делал, но при использовании WinApi алгоритм возможен примерно такой:
CreateFile - открыть порт;
GetCommTimeouts, SetCommTimeouts, GetCommState, SetCommState и т.д. - установить необходимые настройки;
GetCommMask, SetCommMask - установить нужные флаги событий;
WaitCommEvent - ждать события.

Подключают сигнал обычно на CTS или DSR (могу ошибаться). И будет ли он ловить напряжение 1-5 вольт не знаю, вообще для COM-порта стандартные уровни что-то около 12 вольт, хотя можно наверное сделать схемку, что бы управлялось нулем.

2.
Либо искать готовый компонет который может все это делать.
 
Z

zubr

#3
1. Сигнал удобно подавать на входы порта DSR или CTS. Но есть нюанс: com-порт воспринимает напряжение на входах в интервале от -3В до -12В как логическую единицу и в интервале от +3В до +12В как логический ноль, а интервал от +3В до -3В является зоной неопределенности. Поэтому если делать "как положено" то необходимо между источником сигнала и входом com-порта поставить преобразователь уровня (ТТЛ или КМОП в RS-232). Но можно попробовать и без него: встречал устройство для ком-порта (программатор микроконтроллеров) в котором цифровой сигнал (с КМОП уровнями) подавался на вход CTS и вроде бы работало... но лично я такой вариант считаю кустарщиной.
2. Можешь воспользоваться моим компонентом http://codeby.net/forum/threads/4650.html. В событии OnEventMasksResult выполнять функцию GetCommModemStatus для определения уровня сигнала.
 
X

xsaser

#4
Поясняю идея вообще такая к ком порту надо подключить телефонную линию при поступлении звонка программа к примеру должна выдать сообщение... ну дальше разберусь сам мне главное как подключить и проверить поступил или нет звонок если можно кто нить кинте кусочек исходника
 
S

Shurik Ilyin

#5
Поясняю идея вообще такая к ком порту надо подключить телефонную линию при поступлении звонка программа к примеру должна выдать сообщение... ну дальше разберусь сам мне главное как подключить и проверить поступил или нет звонок если можно кто нить кинте кусочек исходника
Ты бы сказал зачем тебе все это надо?
Может готовое устройство уже есть или что-нибудь аналогичное от чего можно оттолкнуться.

Пока же я вижу тебе сперва надо разобраться с подключением, а потом уже можно и код клепать какой угодно. А подключением обычно знимаются электронщики, а не программисты - у них и спрашивай.
 
X

xsaser

#6
допустим что я его уже подключил как в Делфи проверить поступает сигнал (напряжение) или нет
если можно кинте кусочек кода а то по всему инету не чего подобного найти не могу
 
S

Shurik Ilyin

#7
допустим что я его уже подключил как в Делфи проверить поступает сигнал (напряжение) или нет
если можно кинте кусочек кода а то по всему инету не чего подобного найти не могу
Допустим тебе прислали кусочек кода, как ты узнаешь будет ли он работать с твоей будущей железякой неизвестной конструкции?

Или ты что-то типа диплома пишешь где конечный результат мало кого волнует лишь бы на бумаге работало?

Выше в сообщении от zubr'а есть совет воспользоваться его компонентом: перейди по ссылке, скачай, установи, изучи примеры. Что не понятно - спрашивай у автора, сдается мне он в этой теме хорошо соображает и сможет качественно ответить на твой правильно поставленный вопрос.
 
X

xsaser

#8
народ просто кинте кусочек исходника как отследить подали мы на ком порт сигнал или нет если да допустим пусть выдает сообщение... ,без всяких компонентов
 
S

sdriver

#9
Да вам, батенька нужна программка LG Comm Spy, а на компоненте сложно что ли сделать?
 
Z
#10
Так тебе батенька все, что надо сделать - это подключить модем и отслеживать сигнал Ring, в моем компоненте все это реализовано и даже есть примеры как это работает. Писать исходник как сделать без компонента сейчас нет времени, может вечерком или в выходные.
 
Z
#11
Надо сделать что то типа этого:
1. В основном потоке приложения открыть и инициализировать порт:
Код:
function TKlientServComConnect.Init_port_standard:boolean;
var
s:string;
dcb:_DCB;
cto:TCommTimeOuts;
begin
Result:=False;
FComPort.FPortHandle:=CreateFile(PChar(FComPort.ComName), GENERIC_READ or GENERIC_WRITE,
0, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL or FILE_FLAG_OVERLAPPED, 0);
If FComPort.FPortHandle=INVALID_HANDLE_VALUE then
begin
s:='Not connection to port '+FComPort.ComName;
MessageBox(0, PChar(s), PChar(Name),
MB_ICONERROR+MB_OK);
exit;
end;
GetCommState(FComPort.FPortHandle, dcb);
dcb.EvtChar:='~';
dcb.BaudRate:=WindowsBaudRates[FComPort.FComProp.BaudRate];
dcb.ByteSize:=8;
dcb.Parity:=NOPARITY;
dcb.StopBits:=TWOSTOPBITS;
dcb.Flags:=dcb.Flags and (not dcb_ParityCheck);
dcb.Flags:=dcb.Flags or dcb_OutxCtsFlow;
dcb.Flags:=dcb.Flags and (not dcb_OutxDsrFlow);
dcb.Flags:=dcb.Flags and (not dcb_DtrControlMask);
dcb.Flags:=dcb.Flags or dcb_DtrControlEnable;
dcb.Flags:=dcb.Flags and (not dcb_DsrSensivity);
dcb.Flags:=dcb.Flags or dcb_TXContinueOnXoff;
dcb.Flags:=dcb.Flags and (not dcb_OutX);
dcb.Flags:=dcb.Flags and (not dcb_InX);
dcb.Flags:=dcb.Flags and (not dcb_ErrorChar);
dcb.Flags:=dcb.Flags and (not dcb_NullStrip);
dcb.Flags:=dcb.Flags and (not dcb_RtsControlMask);
dcb.Flags:=dcb.Flags or dcb_RtsControlEnable;
dcb.Flags:=dcb.Flags and (not dcb_AbortOnError);
SetCommState(FComPort.FPortHandle, dcb);
Result:=True;
end;
2. Создать поток прослушки, вот код Execute потока:
Код:
Procedure TLeastenThread.Execute;
var
ReadOL : TOverLapped;
Mask, Ev_Mask : DWORD;
SumMask:TEventMasks;
begin
try
FillChar(ReadOL, SizeOf(ReadOL), 0);
ReadOL.hEvent:= CreateEvent(nil, True, True, nil);
Ev_Mask:=EV_BREAK+EV_CTS+EV_DSR+EV_ERR+EV_RING+EV_RLSD+EV_RXCHAR+EV_RXFLAG+
EV_TXEMPTY;
SetCommMask(FOwner.PortHandle, Ev_Mask);
While (not Terminated) and FOwner.Connected do
begin
Synchronize(DoCopyEventMasks);
WaitCommEvent(FOwner.PortHandle, Mask, @ReadOL);
ResetEvent(FOwner.FEvent_ReadThread);
ResetEvent(FOwner.FEvent_SetNumberThread);
If WaitForSingleObject(ReadOL.hEvent, {500}infinite)=WAIT_OBJECT_0 then
begin
SumMask:=[];
If (Mask and EV_BREAK)<>0 then
begin
SumMask:=[mEV_BREAK];
end;
If (Mask and EV_CTS)<>0 then
begin
SumMask:=SumMask+[mEV_CTS];
end;
If (Mask and EV_DSR)<>0 then
begin
SumMask:=SumMask+[mEV_DSR];
end;
If (Mask and EV_ERR)<>0 then
begin
SumMask:=SumMask+[mEV_ERR];
end;
If (Mask and )<>0 then
begin
SumMask:=SumMask+[mEV_RING];
{inc(FRingCount);
Synchronize(DoMessage_RING);}
end;
If (Mask and EV_RLSD)<>0 then
begin
SumMask:=SumMask+[mEV_RLSD];
Synchronize(DoMessage_RLSD);
end;
If (Mask and EV_RXCHAR)<>0 then
begin
SumMask:=SumMask+[mEV_RXCHAR];
Synchronize(DoSetEvent_ReadThread);
Synchronize(DoMessage_RXCHAR);
end;
If (Mask and EV_RXFLAG)<>0 then
begin
SumMask:=SumMask+[mEV_RXFLAG];
end;
If (Mask and EV_TXEMPTY)<>0 then
begin
SumMask:=SumMask+[mEV_TXEMPTY];
end;
FResultMask:=SumMask*FEventMasks;
If FResultMask<>[] then
begin
Synchronize(DoEventMasksResult);
end;
end;
end;
finally
CloseHandle(ReadOL.hEvent);
SetCommMask(FOwner.PortHandle, 0);
end; 
end;
В твоем случае, надо только реагировать на маску EV_RING.
Код взят из моего компонента, переводить в обычный код нет времени, ну если хоть какие то понятия в программировании COM-портов имеешь - разберешься, иначе вперед к изучению, благо в инете инфы по этим вопросам полно.
 
Статус
Закрыто для дальнейших ответов.