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

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

Deamon

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

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

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

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

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

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

zubr

Гость
#2
Вот как я инициализирую структуру DCB в своем компоненте KlientServComConnect:
Код:
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);
 
D

Deamon

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

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

zubr

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