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

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

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

    xsaser Гость

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

    Shurik Ilyin Гость

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

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

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

    zubr Гость

    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 Гость

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

    Shurik Ilyin Гость

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

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

    xsaser Гость

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

    Shurik Ilyin Гость

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

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

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

    xsaser Гость

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

    sdriver Гость

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

    zubr Гость

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

    zubr Гость

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

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