Работа с Com портом

Тема в разделе "Delphi - Система", создана пользователем Deamon, 3 дек 2006.

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

    Deamon Гость

    Прошу прощения, если подобная тема уже существует. по запросу "232" и "com" поиск ничего не выдал.

    Я создал приложение, которое обращается к com порту через CreateFile. Но по ReadFile программа выдает неверные(покоцанные) данные.

    Я подозреваю, что это из-за того, что я использую неверные настройки в dcb структуре. А именно в поле Flags. Смотрю в сторону флагов fDtrControl fRtsControl.

    Весь инет облазил, не нашел нигде где-бы показывался пример установки флагов этих флагов. Дело в том, если я поле flags определяю, как
    Код (Text):
    dcb.Flags:=dcb.Flags or fDtrControl;
    то вызов SetCommState происходит нормально. А при
    Код (Text):
    dcb.Flags:=dcb.Flags or fDtrControl or fRtsControl*DTR_CONTROL_ENABLE;
    или
    Код (Text):
    dcb.Flags:=dcb.Flags or fDtrControl or fRtsControl;
    SetCommState выдает false =(.

    И вообще возможно, что ReadFile получает покарёжанную инфу именно из-за этих флагов?

    Заранее спасибо за ответ.
     
  2. zubr

    zubr Гость

    Вот как я инициализирую структуру DCB в своем компоненте KlientServComConnect:
    Код (Text):
    Const
    dcb_Binary           = $00000001;
    dcb_ParityCheck      = $00000002;
    dcb_OutxCtsFlow      = $00000004;
    dcb_OutxDsrFlow      = $00000008;
    dcb_DtrControlMask   = $00000030;
    dcb_DtrControlDisable  = $00000000;
    dcb_DtrControlEnable    = $00000010;
    dcb_DtrControlHandshake = $00000020;
    dcb_DsrSensivity        = $00000040;
    dcb_TXContinueOnXoff    = $00000080;
    dcb_OutX                = $00000100;
    dcb_InX              = $00000200;
    dcb_ErrorChar         = $00000400;
    dcb_NullStrip         = $00000800;
    dcb_RtsControlMask   = $00003000;
    dcb_RtsControlDisable  = $00000000;
    dcb_RtsControlEnable    = $00001000;
    dcb_RtsControlHandshake = $00002000;
    dcb_RtsControlToggle    = $00003000;
    dcb_AbortOnError        = $00004000;
    dcb_Reserveds         = $FFFF8000;


    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);
     
  3. Deamon

    Deamon Гость

    Спасибо огромное за ответ.

    А может быть такое, что информация с порта портиться именно из-за неправельной настройки этих флагов?
     
  4. zubr

    zubr Гость

    Причин может быть много, в том числе и флаги, может быть неправильная синхронизация, скорость порта не соответствовать устройству, паритет и т. п.
     
Загрузка...
Статус темы:
Закрыта.

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