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

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

xsaser

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

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

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

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

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

Выше в сообщении от zubr'а есть совет воспользоваться его компонентом: перейди по ссылке, скачай, установи, изучи примеры. Что не понятно - спрашивай у автора, сдается мне он в этой теме хорошо соображает и сможет качественно ответить на твой правильно поставленный вопрос.
 
народ просто кинте кусочек исходника как отследить подали мы на ком порт сигнал или нет если да допустим пусть выдает сообщение... ,без всяких компонентов
 
Да вам, батенька нужна программка LG Comm Spy, а на компоненте сложно что ли сделать?
 
Так тебе батенька все, что надо сделать - это подключить модем и отслеживать сигнал Ring, в моем компоненте все это реализовано и даже есть примеры как это работает. Писать исходник как сделать без компонента сейчас нет времени, может вечерком или в выходные.
 
Надо сделать что то типа этого:
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-портов имеешь - разберешься, иначе вперед к изучению, благо в инете инфы по этим вопросам полно.
 
Статус
Закрыто для дальнейших ответов.
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!