пятница, 17 сентября 2010 г.

Как менять скорость передачи через COM порт, не меняя сигнал RTS

К примеру, у вас есть устройство с которым обмен по последовательному порту (будь-то физическому или виртуальному over USB) осуществляется посредством API Windows и в процессе работы вам необходимо менять скорость обмена, не меняя состояние задействованных линий DTR/RTS. Казалось-бы задача нетривиальная, ведь SetCommState() меняет состояние служебных линий на изначальное. Это лишь на первый взгляд, если не полистывать перед сном MSDN за чашечкой кофе )

Ведь задача яйца выеденного не стоит. Обратите внимание на порядок операций при настройке порта и заполнения структуры DCB:
...
DCB.BaudRate = ...
DCB.Flags = 1 or ($30 and (DTR_CONTROL_ENABLE shl 4))
                   or ($3000 and (RTS_CONTROL_ENABLE shl 12));
...
SetCommState(FHandle, DCB);
О как, волшебный флаг Flags. Каково же значение его битовых полей? Обратимся к MSDN:
typedef struct _DCB {   
   DWORD DCBlength;               // sizeof(DCB)
   DWORD BaudRate;                 // current baud rate
   DWORD fBinary: 1;               // binary mode, no EOF check
   DWORD fParity: 1;                // enable parity checking
   DWORD fOutxCtsFlow:1;    // CTS output flow control
   DWORD fOutxDsrFlow:1;    // DSR output flow control
   DWORD fDtrControl:2;        // DTR flow control type
   DWORD fDsrSensitivity:1;   // DSR sensitivity 
   DWORD fTXContinueOnXoff:1;  // XOFF continues Tx
   DWORD fOutX: 1;                           // XON/XOFF out flow control
   DWORD fInX: 1;                             // XON/XOFF in flow control
   DWORD fErrorChar: 1;                 // enable error replacement
   DWORD fNull: 1;                            // enable null stripping
   DWORD fRtsControl:2;                // RTS flow control
   DWORD fAbortOnError:1;         // abort reads/writes on error
   DWORD fDummy2:17;                // reserved    WORD wReserved; // not currently used

   WORD XonLim;              // transmit XON threshold
   WORD XoffLim;              // transmit XOFF threshold
   BYTE ByteSize;              // number of bits/byte, 4-8
   BYTE Parity;                  // 0-4=no,odd,even,mark,space
   BYTE StopBits;              // 0,1,2 = 1, 1.5, 2
   char XonChar;              // Tx and Rx XON character
   char XoffChar;              // Tx and Rx XOFF character
   char ErrorChar;            // error replacement character

   char EofChar;               // end of input character
   char EvtChar;               // received event character
   WORD wReserved1;     // reserved; do not use
} DCB;
И потом, схемотехнику выхода-входа следует строить таким образом, чтобы исходное состояние линии по-умолчанию было отсутствием события для вашего устройства. Как говорится, на этом все ) 

Комментариев нет:

Отправить комментарий

В комментариях уважайте собеседника, внимательно читайте посты и не додумывайте. Просьбы и предложения из разряда: «можно ваш Skype/Viber/телефон», «напишите мне в vk/FB», а также другие им подобные — игнорируются. Выход новых версий ПО, внешняя ссылка, переставшая работать с течением времени и т.п. не является основанием для претензий. Желающие спокойно подискутировать и высказаться — Welcome. Желающие спонсировать блог — Donate. Нарушение этих простых правил ведет к бану и удалению комментариев без предупреждения.