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

Тема в разделе "Delphi - Система", создана пользователем xsaser, 6 июн 2006.

Статус темы:
Закрыта.
  1. xsaser

    xsaser Гость

    Репутация:
    0
    Народ помогите с программированием comm port-ов
    суть идеи такая на ком порт должно подаваться сигнал точнее говоря напряжение от 1-5В
    Если напряжение поступило на ком порт то допустим надо выдать сообщение если нет то не че не делать
    Вот мне не понятно как в Делфи вот это самое написать
    и не так важное новсе таки к каким пинам подключать что он принял
    Пожалуйста помогите
    Заранее благодарен
     
  2. Shurik Ilyin

    Shurik Ilyin Гость

    Репутация:
    0
    1.
    Сам не делал, но при использовании WinApi алгоритм возможен примерно такой:
    CreateFile - открыть порт;
    GetCommTimeouts, SetCommTimeouts, GetCommState, SetCommState и т.д. - установить необходимые настройки;
    GetCommMask, SetCommMask - установить нужные флаги событий;
    WaitCommEvent - ждать события.

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

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

    zubr Гость

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

    xsaser Гость

    Репутация:
    0
    Поясняю идея вообще такая к ком порту надо подключить телефонную линию при поступлении звонка программа к примеру должна выдать сообщение... ну дальше разберусь сам мне главное как подключить и проверить поступил или нет звонок если можно кто нить кинте кусочек исходника
     
  5. Shurik Ilyin

    Shurik Ilyin Гость

    Репутация:
    0
    Ты бы сказал зачем тебе все это надо?
    Может готовое устройство уже есть или что-нибудь аналогичное от чего можно оттолкнуться.

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

    xsaser Гость

    Репутация:
    0
    допустим что я его уже подключил как в Делфи проверить поступает сигнал (напряжение) или нет
    если можно кинте кусочек кода а то по всему инету не чего подобного найти не могу
     
  7. Shurik Ilyin

    Shurik Ilyin Гость

    Репутация:
    0
    Допустим тебе прислали кусочек кода, как ты узнаешь будет ли он работать с твоей будущей железякой неизвестной конструкции?

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

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

    xsaser Гость

    Репутация:
    0
    народ просто кинте кусочек исходника как отследить подали мы на ком порт сигнал или нет если да допустим пусть выдает сообщение... ,без всяких компонентов
     
  9. sdriver

    sdriver Гость

    Репутация:
    0
    Да вам, батенька нужна программка LG Comm Spy, а на компоненте сложно что ли сделать?
     
  10. zubr

    zubr Гость

    Репутация:
    0
    Так тебе батенька все, что надо сделать - это подключить модем и отслеживать сигнал Ring, в моем компоненте все это реализовано и даже есть примеры как это работает. Писать исходник как сделать без компонента сейчас нет времени, может вечерком или в выходные.
     
  11. zubr

    zubr Гость

    Репутация:
    0
    Надо сделать что то типа этого:
    1. В основном потоке приложения открыть и инициализировать порт:
    Код (Text):
    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 потока:
    Код (Text):
    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-портов имеешь - разберешься, иначе вперед к изучению, благо в инете инфы по этим вопросам полно.
     
Загрузка...
Статус темы:
Закрыта.

Поделиться этой страницей