Работа с COM и LPT в Win32. - [2]
hTemplateFile
Задает описатель файла-шаблона. При работе с портами всегда должен быть равен NULL.
При успешном открытии файла, в нашем случае порта, функция возвращает описатель (HANDLE) файла. При ошибке INVALID_HANDLE_VALUE. Код ошибки можно получитить вызвав функцию GetLastError, но ее описание выходит за рамки данной статьи.
Открытый порт должен быть закрыт перед завершением работы программы. В Win32 закрытие объекта по его описателю выполняет функция CloseHandle:
>BOOL CloseHandle(HANDLE hObject);
Функция имеет единственный параметр – описатель закрываемого объекта. При успешном завершении функция возвращает не нулевое значение, при ошибке нуль.
Теперь пример (достаточно очевидный):
>#include
>. . .
>HANDLE port;
>. . .
>port=CreateFile("COM2", GENERIC_READ|GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);
>if (port==INVALID_HANDLE_VALUE) {
> MsgBox(NULL, "Невозможно открыть последовательный порт", "Error", MB_OK);
> ExitProcess(1);
>}
>. . .
>CloseHandle(port);
>. . .
В данном примере открывается порт СОМ2 для чтения и записи, используется синхронный режим обмена. Проверяется успешность открытия порта, при ошибке выводится сообщение и программа завершается. Если порт открыт успешно, то он закрывается.
Открыв порт мы получили его в свое распоряжение. Теперь с портом может работать только наша программа. Однако, прежде чем мы займемся вводом/выводом, мы должны настроить порт. Это касается только последовательных портов, для которых мы должны задать скорость обмена, параметры четности, формат данных и прочее. Кроме того существует несколько специфичных для Windows параметров. Речь идет о тайм-аутах, которые позволяют контролировать как интервал между принимаемыми байтами, так и общее время приема сообщения. Есть возможность управлять состоянием сигналов управления модемом. Но обо всем по порядку.
Основные параметры последовательного порта описываются структурой DCB. Временные параметры структурой COMMTIMEOUTS. Существует еще несколько информационных и управляющих структур, но они используются реже. Настройка порта заключается в заполнении управляющих структур и последующем вызове функций настройки.
Поскольку основную информацию содержит структура DCB с ее описания и начнем:
>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;
Если внимательно присмотреться, то можно заметить, что эта структура содержит почти всю управляющую информацию, которая в реальности располагается в различных регистрах последовательного порта. Теперь разберемся, что означает каждое из полей самой важной структуры:
DCBlength
Задает длину, в байтах, структуры DCB. Используется для контроля корректности структуры при передаче ее адреса в функции настройки порта.
BaudRate
Скорость передачи данных. Возможно указание следующих констант: CBR_110, CBR_300, CBR_600, CBR_1200, CBR_2400, CBR_4800, CBR_9600, CBR_14400, CBR_19200, CBR_38400, CBR_56000, CBR_57600, CBR_115200, CBR_128000, CBR_256000. Как видно, эти константы соответствуют всем стандартным скоростям обмена. На самом деле, это поле содержит числовое значение скорости передачи, а константы просто являются символическими именами. Поэтому можно указывать, например, и CBR_9600, и просто 9600. Однако рекомендуется указывать символические константы.
fBinary
Включает двоичный режим обмена. Win32 не поддерживает недвоичный режим, поэтому данное поле всегда должно быть равно 1, или логической константе TRUE (что предпочтительней). В Windows 3.1, если это поле было равно FALSE, включался текстовый режим обмена. В этом режиме поступивший на вход порта символ заданый полем EofChar свидетельствовал о конце принимаемых данных.
Разработчику часто требуется много сторонних инструментов, чтобы создавать и поддерживать проект. Система Git — один из таких инструментов и используется для контроля промежуточных версий вашего приложения, позволяя вам исправлять ошибки, откатывать к старой версии, разрабатывать проект в команде и сливать его потом. В книге вы узнаете об основах работы с Git: установка, ключевые команды, gitHub и многое другое.В книге рассматриваются следующие темы:основы Git;ветвление в Git;Git на сервере;распределённый Git;GitHub;инструменты Git;настройка Git;Git и другие системы контроля версий.
Рассмотрено все необходимое для разработки, компиляции, отладки и запуска приложений Java. Изложены практические приемы использования как традиционных, так и новейших конструкций объектно-ориентированного языка Java, графической библиотеки классов Swing, расширенной библиотеки Java 2D, работа со звуком, печать, способы русификации программ. Приведено полное описание нововведений Java SE 7: двоичная запись чисел, строковые варианты разветвлений, "ромбовидный оператор", NIO2, новые средства многопоточности и др.
В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.
В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.
В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.
Python - объектно-ориентированный язык сверхвысокого уровня. Python, в отличии от Java, не требует исключительно объектной ориентированности, но классы в Python так просто изучить и так удобно использовать, что даже новые и неискушенные пользователи быстро переходят на ОО-подход.