Что такое код ungetcommchar

Содержание

Функции Win32 API [ U ]

Delphi , Синтаксис , Справочник по API-функциям

Описание:
function UngetCommChar(Cid: Integer; AChar: Char): Integer;

Помещает AChar обpатно в очеpедь на пpием устpойства связи.

Паpаметpы:
Cid: Устpойство связи.
AChar: Пpинимаемый символ.

Возвpащаемое значение:
Нуль в случае успешного завеpшения; отpицательное число вследствие того, что еще не пеpедан пpедыдущий символ.

Описание:
function UnhookWindowsHook(Hook: Integer; HookFunc: TFarProc): Bool;

Удаляет функцию пеpехвата из цепочки функций пеpехвата, опpеделяемой паpаметpом Hook.

Паpаметpы:
Hook: Один из кодов wh_CallWndProc, wh_GetMessage, wh_JournalPlaybacf, wh_JournalRecord, wh_Keyboard или wh_MsgFilter. См. pаздел «Коды пеpехвата Windows, wh_», в главе 1.
HookFunc: Адpес экземпляpа пpоцедуpы функции пеpехвата.

Возвpащаемое значение:
Не нуль в случае успешного завеpшения; 0 — в пpотивном случае.

функция находится в файле user32.dll

Описание:
function UnionRect(var DestRect; Src1Rect, Src2Rect: LPRect): Integer;

Создает объединение двух пpямоугольников и помещает pезультат в DestRect.

Паpаметpы:
DestRect: Результиpующая стpуктуpа TRect.
Src1Rect: Стpуктуpа 1 исходного TRect.
Src2Rect: Стpуктуpа 2 исходного TRect.

Возвpащаемое значение:
Не нуль, если объединение непусто; 0 — в пpотивном случае.

функция находится в файле user32.dll

Описание:
function UnlockData(Dummy: Integer): THandle;

Разблокиpует текущий пеpемещаемый сегмент данных.

Паpаметpы:
Dummy: Не используется. Установлен в 0.

Возвpащаемое значение:
Идентификатоp для pазблокиpованного сегмента; 0 — в случае неудачи.

Описание:
function UnlockResource(RezData: THandle): Bool;

Разблокиpует pесуpс RezData и уменьшает его счетчик ссылок.

Паpаметpы:
RezData: Идентификатоp блока глобальной памяти.

Возвpащаемое значение:
Нуль, если счетчик ссылок pавен 0; не нуль — в пpотивном случае.

Описание:
function UnlockSegment(Segment: Word): THandle;

Разблокиpует сегмент, указанный паpаметpом Segment.

Паpаметpы:
Segment: Адpес сегмента или -1 для pазблокиpования текущего сегмента данных.

Возвpащаемое значение:
Нуль, если счетчик ссылок уменьшился до 0; не нуль — в пpотивном случае.

См. также: LockSegment

Описание:
function UnrealizeObject(hObject: HBrush): Bool;

Указывает GDI, что нужно установить в исходное положение выбиpаемое в следующий pаз начало, если hObject является кистью, или pеализовать палитpу, если hObject является логической
палитpой.

Паpаметpы:
hObject: Сбpасываемый в исходное состояние объект.

Возвpащаемое значение:
Не нуль в случае успешного завеpшения; 0 — в пpотивном случае.

функция находится в файле gdi32.dll

Описание:
function UnregisterClass(ClassName: PChar; Instance: THandle): Bool;

Удаляет класс окна из таблицы классов окна и освобождает всю связанную с ним память.

Паpаметpы:
ClassName: Имя класса (заканчивающееся пустым символом) pанее заpегистpиpованного класса.
Instance: Экземпляp модуля, создавшего класс.

Возвpащаемое значение:
Не нуль в случае успешного завеpшения; 0 — если указано невеpное значение для ClassName или если окно класса существует.

См. также: RegisterClass

функция находится в файле user32.dll

Описание:
function UpdateColors(DC: HDC): Integer;

Обновляет область пользователя, сpавнивая по элементам изобpажения текущие цвета области пользователя с системной палитpой.

Паpаметpы:
DC: Идентификатоp контекста устpойства.

Возвpащаемое значение:
Не используется.

функция находится в файле gdi32.dll

Описание:
function UpdateWindow(Wnd: HWnd);

Если область обновления окна непуста, то посылает сообщение wm_Paint пpямо оконной функции данного окна.

Паpаметpы:
Wnd: Идентификатоp окна.

функция находится в файле user32.dll

Статья Функции Win32 API [ U ] раздела Синтаксис Справочник по API-функциям может быть полезна для разработчиков на Delphi и FreePascal.

Комментарии и вопросы

Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.

Неполадки подключения или неверный код MMI — что делать

Автор: admin · Опубликовано Июнь 13, 2020 · Обновлено Июнь 13, 2020

Бывает, что при попытке позвонить, отослать смс или сделать запрос оператору ваш телефон выдаёт сообщение «Проблема подключения или недействительный код mmi». Данное сообщение может появиться в самый неподходящий момент, и вызвать кучу неудобств, особенно когда ваше дело не терпит отлагательств. В этом материале я расскажу, что это за проблема неверного кода mmi, а также поделюсь лучшими методами того, как устранить неполадки подключения или неверный код MMI, сделав так, чтобы ваш Андроид телефон работал долго и надёжно.

Ошибка «Проблема подключения или недействительный код mmi»

Что такое MMI

Код MMI (Man-Machine Interface – «Интерфейс Человек-Машина») используется для формулировки USSD запросов, позволяющих организовывать интерактивное взаимодействие между абонентами сети и сервисными приложениями оператора. Пользователь использует MMI чтобы узнать баланс, пополнить счёт, подключить или отключить какую-либо услугу, перейти на другой тарифный план и так далее.

Обычно код MMI начинается со звёздочки и заканчивается решёткой, при сложных запросах в качестве разделителя также используется звёздочка.

Проблема подключения или недействительный код mmi – причины и решения

Данная ошибка может встретиться у разных мобильных операторов и у разных мобильных устройств, проявляя себя в виде сообщения «Неполадки подключения или неверный код MMI», «Недействительный код MMI», «Connection problem or invalid MMI» и других.

Ошибка на английском «Connection problem or invalid MMI»

Часто проблема с кодом mmi возникает внезапно, и так же внезапно может пропасть, оставляя пользователя в недоумении насчёт реальных источников её появления. Ниже я перечислю список существующих причин возникновения проблемы, а также расскажу о способах устранения неисправности.

Нестабильная работа 3G-сетей оператора

Работа сегодняшних 3G-сетей России, Украины и других постсоветских стран ещё далека от идеальной. Бывают сбои, потери сигнала, ненадёжная работа оборудования и прочие неприятности, которые проявляют себя на вашем устройстве в виде переключения значка сети с 3G на 2G и обратно.

Чтобы решить проблему неполадок подключения или неверного кода MMI, достаточно отключить на время 3G-подключение, дав вашему оператору время на исправление неполадок.

  1. Для этого зайдите в настройки вашего устройства, перейдите в «Передача данных».
  2. Затем в правом верхнем углу выберите пункт «Мобильные сети».

Выбираем в «Передаче данных» — «Мобильные сети»

Выбираем сеть 2G

Физический износ сим-карты вызывает неполадки подключения или неверный код MMI

Одна из наиболее распространённых проблем. Если сим-карта у вас работает много лет, или часто вынимается и вставляется, тогда она может утратить свою работоспособность вследствие износа. Попробуйте подключить её к другому телефону и проверить её работоспособность. Если на другом телефоне наблюдается похожая проблема с неверным кодом MMI, тогда можно попробовать протереть её контакты, а в случае продолжения проблемы – обратиться в офис своего мобильного оператора за заменой (специалисты рекомендуют менять симку каждые 2 года).

Неполадки с настройками устройства

Неверные настройки устройства, а также неполадки в его работе могут вызывать проблему — неполадки подключения или неверный код MMI.

  1. Попробуйте перезагрузить устройство, а если проблема остаётся – попробуйте выполнить полный сброс данных.
  2. Зайдите в «Настройки» — «Архивация и сброс» — «Сброс данных» — «Сброс устройства» (иначе «Настройки» — «Резервное копирование» — «Сброс данных»).

Временные неполадки у мобильного оператора

В этом случае остаётся только подождать. Можно позвонить к оператору и узнать, насколько долго будет наблюдаться ошибка с MMI.

Работа некоторых приложений

Некоторые из скачанных извне приложений могут являться причиной возникновения ошибки с неполадками подключения или неверного кода MMI. Чтобы подтвердить или опровергнут данное подозрение, загрузите своё устройство в безопасном режиме и попробуйте осуществить запрос к оператору. Если он пройдёт нормально – значит виновато какое-то свежее приложение из установленных на телефоне, которое необходимо будет удалить.

Как зайти в безопасный режим на вашем устройстве узнайте на сайте производителя вашего гаджета. На моём, Samsung это делается так.

  • Сначала необходимо выключить устройство, затем нажать кнопку его включения, а после того, как устройство включится, необходимо зажать кнопку «Громкость вниз» на несколько секунд (пока происходит показ логотипов разработчика).
  • После таких действий ваш смартфон (планшет) загрузится в безопасном режиме (вы увидите внизу экрана надпись об этом), и вы сможете протестировать его работу.

Заключение

Как мы можем видеть, неполадки подключения и неверный код MMI обычно обусловлены нестабильностью сетей мобильного оператора, а также физическим износом sim-карты. Причинами проблемы могут выступать и неверные настройки телефона, а также сторонние приложения, способные вызывать сбои в работе мобильного устройства. Если наблюдается подобная ошибка, то, прежде всего, попробуйте связаться с вашим мобильным оператором – вполне возможно, что причина не у вас, а у него.

Модемы и факс-модемы. Программирование для MS-DOS и Windows.

7. Модемы и операционная система Windows

Данная глава книги будет посвящена программированию асинхронных последовательных адаптеров и модемов в среде операционной системы Windows. В ней вы найдете подробное описание функций программного интерфейса Windows, сообщений и структур данных, предназначенных для взаимодействия с устройствами (модемами, факс-модемами), подключенными к асинхронному последовательному адаптеру.

В этой главе нами приведены исходные тексты небольших телекоммуникационных программ, предназначенных для работы в среде операционной системы Windows.

7.1. Драйвер асинхронного последовательного адаптера

Драйвер асинхронного последовательного адаптера представляет собой специальную библиотеку динамической компоновки. Он экспортирует набор функций, которые Windows может использовать для того, чтобы открыть порт, установить новый режим его работы, передать и принять данные, определить состояние порта и причину возникновения ошибок.

Однако приложения не обращаются непосредственно к этим функциям. Вместо этого они обращаются к функциям, экспортируемым из модуля USER, операционной системы Windows — OpenComm, CloseComm и т. д. Подробное описание данных функций представлено в следующем разделе книги.

Функции из модуля USER обращаются уже непосредственно к драйверу асинхронного последовательного адаптера.

В состав операционных систем Windows 3.1 и Windows for Worksgroups 3.11 входит драйвер асинхронного последовательного адаптера COMM.DRV. Этот драйвер позволяет получить доступ к портам COM1, COM2, COM3 и COM4. При этом драйвер использует для COM-портов адреса, записанные в области переменных (данных) BIOS.

Если область переменных BIOS не содержит информации о COM-портах, то базовые адреса и номера линии IRQ пользователь должен установить самостоятельно при помощи приложения Control Panel.

Введенная вами информация записывается в директивах COMxBase и COMxIRQ из раздела [386Enh] файла SYSTEM.INI. Данные из этих директив используются только в случае, когда в области переменных BIOS нет данных.

Драйвер асинхронного последовательного адаптера определяет тип микросхемы UART, на основе которой построен асинхронный последовательный адаптер. Если он обнаруживает UART 16550A, то включает аппаратный буфер FIFO, расположенный на нем.

В этом случае Windows устойчиво работает на скоростях 9600 бит/с и выше. Многие компьютеры, на которых не установлена эта микросхема, теряют информацию во время передачи данных и не могут установить связь на скорости выше 9600 бит/с.

7.2. Телекоммуникационные функции

Практически все функции, которые мы будем описывать в разделе «Телекоммуникационные функции», могут быть использованы для работы с параллельным адаптером. Однако из-за ограниченного объема книги мы не приводим сведений об использовании параллельных портов компьютера.

7.2.1. Функция OpenComm

Перед тем как приложение сможет начать работу с портом асинхронного последовательного адаптера, оно должно открыть этот порт при помощи функции OpenComm.

Первый параметр функции lpszDevControl определяет открываемый порт и является указателем на строку, закрытую двоичным нулем, содержащую имя порта. Строка должна иметь формат «COMn» для асинхронного последовательного адаптера или «LPTn» для параллельного адаптера. Вместо символа n следует указать номер открываемого порта.

Как вы уже знаете из предыдущих разделов, COM-порт работает под управлением специального драйвера асинхронного последовательного адаптера. Драйвер принимает данные из порта и записывает их во входную очередь. Затем приложение, по мере надобности может прочитать данные из входной очереди. Когда приложение передает данные в COM-порт, они сначала попадают в выходную очередь драйвера, после чего драйвер передает их непосредственно асинхронному адаптеру.

При вызове функции OpenComm вы должны сами определить размер входной и выходной очереди драйвера асинхронного последовательного адаптера.

Параметр cbInQueue задает размер входной очереди COM-порта в байтах, а параметр cbOutQueue — размер выходной очереди в байтах.

В случае успешного выполнения функция возвращает число, определяющее открытый COM-порт. В дальнейшем оно будет использоваться практически всеми телекоммуникационными функциями. Мы будем называть его идентификатором COM-порта.

Если по какой-либо причине COM-порт не открыт, функция OpenComm возвращает отрицательное значение — код ошибки. В следующей таблице перечислены возможные значения, возвращаемые функцией в случае возникновения ошибки:

Значение Смысл
IE_BADID Неверный или неподдерживаемый идентификатор COM-порта
IE_BAUDRATE Установлена скорость передачи информации не поддерживается
IE_BYTESIZE Ошибка при определении размера передаваемых и принимаемых данных
IE_DEFAULT Не поддерживаются характеристики порта, принятые по умолчанию
IE_HARDWARE Порт недоступен. Возможно, порт уже используется другим приложением
IE_MEMORY Не хватает оперативной памяти для размещения входной и выходной очередей COM-порта
IE_NOPEN Порт не открыт
IE_OPEN Порт уже открыт

Функцию OpenComm можно использовать для того, чтобы узнать открыт ли данный COM-порт. Если перед вызовом функции OpenComm присвоить параметрам cbInQueue и cbOutQueue нулевые значения, то функция возвращает константу IE_OPEN, в случае, когда порт уже открыт или IE_MEMORY в противном случае.

В операционных системах Windows 3.1 и Windows for Worksgroups 3.11 можно использовать COM-порты с номерами от 1 до 9 (COM1-COM9) и параллельные порты от 1 до 3 (LPT1-LPT3). Если вы укажете номер порта, не поддерживаемый драйвером, функция OpenComm вернет код ошибки.

Сразу после открытия порта для него устанавливаются режим, принятый по умолчанию (скорость передачи информации, формат данных и т. д.). Чтобы изменить этот режим, необходимо воспользоваться функцией SetCommState.

Ниже мы приводим исходный текст функции OpenComPort, который вы можете использовать для открывания COM-порта. Чтобы открыть порт, достаточно передать этой функции номер порта.

Функция OpenCommPort самостоятельно формирует строку с текстовым именем открываемого COM-порта. Строка формируется с помощью функции wsprintf во временном буфере szTmpNamePort.

Размер входной и выходной очереди COM-порта задается равным 8192 байтам, чего вполне достаточно для простых приложений, не поддерживающих протоколы обмена файлами. Затем определенная нами функция возвращает идентификатор открытого порта или отрицательное число в случае ошибки.

7.2.2. Функция CloseComm

COM-порт является аппаратным ресурсом компьютера. Когда приложение открывает COM-порт, он становится недоступен для других приложений. Поэтому после использования порта, его следует освободить. Для этой цели нужно воспользоваться функцией CloseComm. Функция CloseComm имеет следующий прототип:

Единственный параметр idComDev должен содержать идентификатор порта асинхронного последовательного адаптера, который будет закрыт. Идентификатор порта асинхронного последовательного адаптера возвращает описанная выше функция OpenComm.

Функция возвращает ноль в случае успешного завершения или число, меньшее нуля, в случае ошибки. Одной из причин возникновения ошибки может быть неправильное значение параметра idComDev (т. е. если вы пытаетесь закрыть порт, который не был открыт.

Функция CloseComm закрывает определенный порт асинхронного последовательного адаптера и освобождает всю оперативную память, выделенную для входной и выходной очереди данных. Перед тем как порт будет закрыт, все символы из выходной очереди будут переданы в COM-порт. Чтобы закрыть порт, не дожидаясь передачи всех оставшихся в выходной очереди символов, можно воспользоваться функцией FlushComm, сбрасывающей содержимое очередей без передачи.

7.2.3. Первая программа

Теперь, когда мы рассмотрели первые две функции, предназначенные для управления портами асинхронного последовательного адаптера, приведем исходный текст приложения OPENCOMM, использующего эти функции.

Приложение OPENCOMM последовательно открывает и закрывает все порты асинхронного адаптера, начиная с COM1 до COM8. При этом оно определяет номера доступных портов и выводит на экран их список. Главный файл приложения OPENCOMM представлен в листинге 7.1.

Листинг 7.1. Файл OPENCOMM.CPP

После запуска приложения OPENCOMM, функция WinMain вызывает функцию FindCOMPorts, определяющую список доступных COM-портов.

Функция FindCOMPorts содержит цикл, в котором открывается очередной COM-порт:

Если OpenComm возвращает значение большее или равное нулю, значит COM-порт успешно открыт. В этом случае мы устанавливаем в байте bFindPort бит с номером, соответствующим номеру открытого порта. После этого мы закрываем только что открытый порт:

Затем мы переходим к проверке следующего порта. Если функция OpenComm возвращает значение, меньшее нуля, мы считаем, что порт недоступен.

Проверив в цикле COM-порты от COM1 до COM8, функция FindCOMPorts возвращает байт bFindPort. Каждый бит этого байта отвечает за свой COM-порт.

Установлен бит Порт доступен
COM1
1 COM2
2 COM3
3 COM4
4 COM5
5 COM6
6 COM7
7 COM8

Получив байт bFindPort, WinMain формирует в строке szMsg список доступных портов и выводит его на экран с помощью функции MessageBox (см. рис. 7.1).

Рис 7.1. Список доступных COM-портов

Файл определения модуля приложения OPENCOMM приведен в листинге 7.2.

Листинг 7.2. Файл OPENCOMM.DEF

7.2.4. Определение доступных портов

Драйвер асинхронного последовательного адаптера VCD предоставляет приложениям Windows программный интерфейс через точку входа, адрес которой можно определить, вызвав мультиплексное прерывание INT 2Fh.

Реализация этих функций зависит от конкретного драйвера VCD. Если у вас установлен драйвер, не совместимый с драйвером VCD из DDK, то эти функции могут не работать.

В листинге 7.3. мы приводим исходный текст приложения FINDPORT, которое определяет порты асинхронного последовательного адаптера, доступные приложениям Windows, посредством вызова функции драйвера VCD.

Листинг 7.3. Файл FINDPORT.CPP

После запуска приложения, WinMain вызывает функцию GetWinFlags для определения режима работы Windows. Если Windows работает в стандартном режиме, приложение выводит соответствующее сообщение и завершает свою работу.

Если Windows работает в расширенном режиме, выполняется вызов функции FindCOMPorts, определяющей список доступных COM-портов. Затем полученный список доступных портов отображается на экране.

Функция FindCOMPorts возвращает байт, каждый бит которого отвечает за свой COM-порт. Младший бит соответствует порту COM1, а старший COM8. Исходный текст функции FindCOMPorts представлен в листинге 7.4.

Листинг 7.4. Файл COMM_DRV.CPP

В исходном тексте функции FindCOMPorts нет ни вызова функции OpenComm, ни вызовов других телекоммуникационных функций, она содержит только десяток строк на языке ассемблера. Рассмотрим функцию FindCOMPorts подробней.

Сначала вызывается функция 1684h мультиплексного прерывания INT 2Fh. Для нее в регистре BX передается константа VCD_Device_ID, означающая, что необходимо получить точку входа для драйвера VCD.

Если после вызова мультиплексного прерывания в регистрах ES:DI сохраняются нулевые значения, значит драйвер VCD не поддерживает программный интерфейс и, следовательно, мы не можем получить к нему доступ. В этом случае возвращаем нулевое значение.

Если содержимое регистров ES:DI не равно нулю, значит драйвер VCD доступен. Сохраняем адрес точки входа его интерфейса в переменной lpCOMM:

Затем вызываем функцию из драйвера VCD, предварительно записав в регистр DX значение 1.

После возвращения из этой функции по содержимому регистра AL можно определить, какие из портов асинхронного последовательного адаптера доступны для использования.

Затем мы завершаем выполнение функции FindCOMPorts и возвращаем значение регистра AL.

Файл определения модуля приложения FINDPORT приведен в листинге 7.5.

Листинг 7.5. Файл FINDPORT.DEF

7.2.5. Функция SetCommState

Итак, мы научились открывать и закрывать COM-порт. Однако при вызове функции OpenComm мы указали только его имя и размеры входной и выходной очереди. Ни одной характеристики COM-порта — скорости передачи или формата данных мы не указывали.

Дело в том, что функция OpenComm устанавливает для открываемого порта скорость обмена, формат данных и другие характеристики, принятые по умолчанию. Чтобы изменить эти характеристики, необходимо воспользоваться функцией SetCommState.

Функция SetCommState устанавливает новый режим COM-порта, задаваемый полями структуры DCB, передаваемой ей в качестве одного из параметров.

Параметр lpdcb является дальним указателем на структуру DCB, содержащую описание устанавливаемого режима COM-порта. Подробное описание полей этой структуры мы привели чуть ниже.

Если функция SetCommState успешно установила новый режим работы COM-порта, она возвращает нулевое значение. В противном случае функция возвращает отрицательное значение.

Функция проводит повторную инициализацию всего аппаратного обеспечения COM-порта, но не сбрасывает входную и выходную очереди. Поэтому символы, расположенные во входной и выходной очередях, не будут удалены. В том случае, если желательно удалить эти символы и очистить очереди, следует воспользоваться функцией FlushComm.

7.2.6. Структура DCB

Перейдем к подробному описанию структуры DCB (Device Control Block). Структура DCB содержит информацию, определяющую различные характеристики портов последовательного асинхронного адаптера. В структуре DCB определяется скорость передачи данных, количество бит данных и стоповых бит в передаваемых символах, устанавливается контроль четности и режим управления потоком.

Структура DCB определена в файле WINDOWS.H следующим образом:

В файле WINDOWS.H определен также тип LPDCB — дальний указатель на структуру типа DCB:

typedef DCB FAR* LPDCB;

Опишем назначение отдельных полей структуры DCB.

Поле Id

Содержит идентификатор COM-порта. Значение поля устанавливается функцией BuildCommDCB, описанной ниже, и содержит то же самое значение, которое возвращает функция OpenComm при открытии этого порта.

Если старший бит поля Id установлен, данная структура DCB описывает порт параллельного адаптера.

Поле BaudRate определяет скорость передачи, с которой работает COM-порт. Скорость можно задать двумя способами. Вы можете записать в это поле либо одну из констант CBR_, определенных в файле WINDOWS.H, либо абсолютное значение скорости передачи информации.

Список констант CBR_ и соответствующие им значения скорости перечислены в представленной ниже таблице.

Константа Значение Скорость передачи информации, бит/с
CBR_110 0xFF10 110
CBR_300 0xFF11 300
CBR_600 0xFF12 600
CBR_1200 0xFF13 1200
CBR_2400 0xFF14 2400
CBR_4800 0xFF15 4800
CBR_9600 0xFF16 9600
CBR_14400 0xFF17 14400
CBR_19200 0xFF18 19200
CBR_38400 0xFF1B 38400
CBR_56000 0xFF1F 56000
CBR_128000 0xFF23 128000
CBR_256000 0xFF27 256000

Как видите, старший байт для констант CBR_ содержит значение 0xFF. Поэтому, если вы желаете записать в поле BaudRate абсолютное значение скорости, указывайте числа, меньшие, чем значение константы CBR_110 (0xFF10), и большие 2.

Если вы запишите в поле BaudRate неправильное значение, функция SetCommState завершится с ошибкой IE_BAUDRATE.

Поле ByteSize

В поле ByteSize определяется количество бит в символах, передаваемых и принимаемых через COM-порт. Это поле может содержать любое значение от 4 до 8. Если вы запишете в него другое значение, то функция SetCommState завершится с ошибкой IE_BYTESIZE.

Поле Parity

Поле Parity управляет контролем четности и может содержать одну из пяти констант, перечисленных ниже:

Значение Смысл
EVENPARITY Выполняется проверка на четность
MARKPARITY Бит четности всегда установлен
NOPARITY Проверка на четность не выполняется
ODDPARITY Выполняется проверка на нечетность
SPACEPARITY Бит четности всегда сброшен

Если записать в это поле другое значение, функция SetCommState вернет код ошибки IE_DEFAULT.

Поле StopBits

Поле StopBits задает количество стоповых бит. Поле может содержать одну из констант, перечисленных ниже:

Значение Смысл
ONESTOPBIT 1 стоповый бит
ONE5STOPBITS 1.5 стоповых бита
TWOSTOPBITS 2 стоповых бита

Если записать в это поле другое значение, то функция SetCommState вернет код ошибки IE_DEFAULT.

Поле RlsTimeout

Поле RlsTimeout определяет максимальный интервал времени (тайм-аут), в течение которого функция WriteComm будет ожидать появления сигнала RLSD (ранее обозначался нами как DCD) перед тем, как записать данные в очередь передатчика. Интервал времени задается в миллисекундах.

Вы можете записать в эти поля константы INFINITE или IGNORE, определенные в файле WINDOWS.H как 0xFFFF и 0x0, соответственно.

INFINITE можно перевести как бесконечный, однако это не означает, что функция WriteComm будет бесконечно долго ждать сигнал RLSD. На самом деле эта константа задает интервал времени примерно 65 секунд.

IGNORE означает, что WriteComm не ожидает сигнал RLSD.

Если интервал ожидания истечет, а сигнал RLSD так и не установится, функция WriteComm вернет нулевое значение. Чтобы узнать причину ошибки, вызовите функцию GetCommError. Если функция WriteComm возвратила управление, после того как истек тайм-аут, GetCommError возвратит значение CE_RLSDTO.

Поле CtsTimeout

Поле CtsTimeout определяет максимальный интервал времени (тайм-аут), в течение которого функция WriteComm будет ожидать появления сигнала CTS перед тем, как записать данные в очередь передатчика. Интервал времени задается в миллисекундах.

Вы можете записать в эти поля константы INFINITE или IGNORE. Назначение этих констант уже было рассмотрено нами при описании поля RlsTimeout.

Если интервал ожидания истечет, а сигнал CTS не установится, функция WriteComm вернет нулевое значение. Чтобы узнать причину ошибки, вызовите функцию GetCommError. Если функция WriteComm возвратила управление, после того как истек тайм-аут, GetCommError возвратит значение CE_CTSTO.

Поле DsrTimeout

Поле DsrTimeout определяет максимальный интервал времени (тайм-аут), в течение которого функция WriteComm будет ожидать появления сигнала DSR перед тем, как записать данные в очередь передатчика. Интервал времени задается в миллисекундах.

Вы можете записать в эти поля константы INFINITE или IGNORE. Назначение этих констант было уже рассмотрено при описании поля RlsTimeout.

Если интервал ожидания истечет, а сигнал DSR не установится, функция WriteComm вернет нулевое значение. Чтобы узнать причину ошибки, вызовите функцию GetCommError. Если функция WriteComm возвратила управление, после того как истек тайм-аут, GetCommError возвратит значение CE_DSRTO.

Поле fBinary

Поле fBinary, которое используется как флаг, устанавливает режим передачи двоичной информации. Если это поле содержит значение FALSE (ноль), принятый символ EOF распознается как сигнал для окончания приема данных. Символ EOF определяется полем EofChar структуры DCB.

После того как функция ReadComm прочтет символ EOF из входной очереди, она возвращает управление, не прочитав остальные данные. Если во входном буфере остались непрочитанные данные, они распознаются как переполнение. В этом случае функция GetCommError вернет код ошибки CE_RXOVER.

При получении символа EOF в структуре COMSTAT устанавливается флаг CSTF_EOF.

Если в поле fBinary записано значение TRUE (единица), символ EOF обрабатывается так же, как и остальные символы. Это позволяет беспрепятственно передавать через COM-порт не только текстовые, но также и двоичные данные.

Поле fRtsDisable

Поле fRtsDisable определяет, будет ли использоваться сигнал RTS. Если это флаг установлен, сигнал RTS не используется и все время остается равен нулю. Если поле fRtsDisable содержит нулевое значение (FALSE), сигнал RTS устанавливается, когда COM-порт открывается и сбрасывается, когда порт закрывается.

Чтобы использовать сигнал RTS для управления потоком, необходимо записать в поле fRtsDisable нулевое значение, а в поле fRtsFlow — единицу. Другие комбинации значений fRtsDisable и fRtsFlow блокируют управление потоком по линии RTS.

Ниже перечислены различные комбинации полей fRtsDisable и fRtsFlow:

Поле fRtsDisable Поле fRtsFlow Состояние сигнала RTS
Установлен
1 Разрешено управление потоком по линии RTS
1 Сброшен
1 1 Сброшен

Если сигналы RTS и DTR не используются для управления потоком, их можно устанавливать и сбрасывать с помощью функции EscapeCommFuntion.

Поле fParity

Поле fParity определяет, будет ли выполняться проверка принимаемой и передаваемой информации на четность. Если в этом поле записано значение TRUE, проверка на четность выполняется.

Если функция ReadComm обнаружит ошибку четности, она возвращает отрицательную величину. В этом случае вы должны воспользоваться функцией GetCommError, чтобы определить причину и сбросить флаг ошибки CE_RXPARITY.

Чтобы при обнаружении ошибки по четности в функцию окна поступало сообщение EV_ERR, воспользуйтесь функцией SetCommEventMask.

Поле fOutxCtsFlow

Поле fOutxCtsFlow определяет, что сигнал CTS используется для управления выходным потоком данных. Если это поле содержит значение TRUE и сигнал CTS выключен, передача информации приостанавливается до тех пор, пока сигнал CTS не установится снова.

Если поле CtsTimeout содержит величину, отличную от нуля, функция WriteComm будет ожидать появления сигнала CTS вне зависимости от значения поля fOutxCtsFlow.

Поле fOutxDsrFlow

Поле fOutxDsrFlow определяет, что сигнал DSR используется для управления выходным потоком. Если это поле содержит значение TRUE и сигнал DSR выключен, передача информации приостанавливается до тех пор, пока сигнал CTS снова не установится.

Если поле DsrTimeout содержит величину, отличную от нуля, функция WriteComm будет ожидать появления сигнала DSR вне зависимости от значения поля fOutxDsrFlow.

Поле fDummy

Поле fDummy зарезервировано.

Поле fDtrDisable

Поле fDtrDisable определяет, будет ли использоваться сигнал DTR. Если это флаг установлен, сигнал DTR не используется и остается равен нулю. Если поле fDtrDisable содержит нулевое значение (FALSE), сигнал DTR устанавливается, когда COM-порт открыт, и сбрасывается, когда порт закрывается.

Обычно поле fDtrDisable используют совместно с fDtrFlow. Их использование аналогично полям fRtsDisable и fRtsFlow.

Поле fOutX

Поле fOutX включает протокол управления потоком XON/XOFF. Если это поле установлено, передача информации приостанавливается, когда принимается символ XoffChar, и возобновляется при получении сигнала XonChar.

Если передача данных прерывается в результате приема символа XOFF, в структуре COMSTAT устанавливается флаг CSTF_XOFFHOLD.

Поле fInX

Поле fInX устанавливает протокол управления потоком XON/XOFF при приеме данных. Если это поле установлено, то символ XoffChar передается, когда в очереди приемника становится больше, чем XoffLim символов и символ XonChar, когда в очереди приемника становится меньше, чем XonLim символов.

Если передача данных прерывается в результате передачи символа XOFF, в структуре COMSTAT устанавливается флаг CSTF_XOFFSENT.

Поле fPeChar

Если поле fPeChar содержит значение TRUE, каждый символ, полученный с ошибкой по четности, будет заменен на символ, заданный полем PeChar.

Поле fNull

Если поле fNull содержит значение TRUE, все принятые из COM-порта символы, имеющие нулевое значение, будут пропускаться.

Поле fChEvt

При установке поля fChEvt, получение символа EvtChar отмечается как событие EV_RXFLAG. В действительности поле fChEvt не используется. Необходимо вызвать функцию SetCommEventMask, чтобы разрешить это событие.

Поле fDtrflow

Поле fDtrflow определяет, что сигнал DTR используется для протокола управления потоком (при приеме данных). Если этот флаг установлен, сигнал DTR выключается, когда в приемной очереди становится больше чем XoffLim символов, и включается снова, когда в приемной очереди становится меньше, чем XonLim символов.

Такой механизм позволяет предотвратить переполнение входной очереди COM-порта, которое может вызвать потерю принятых данных.

Поле fRtsflow

Поле fRtsflow определяет, что сигнал RTS используется для управления потоком (при приеме данных). Если это поле установлено, сигнал RTS выключается, когда в приемной очереди становится больше чем XoffLim символов и включается, когда в приемной очереди становится меньше, чем XonLim символов.

Поле fDummy2

Поле fDummy2 зарезервировано.

Поле XonChar

Поле XonChar содержит значение символа XON для передачи и для приема. Смотри описание полей fInX и fOutX.

Функция BuildCommDCB записывает в это поле значение 0x11 ( ).

Поле XoffChar

Поле XoffChar определяет значение символа XOFF для передачи и для приема. Смотри описание полей fInX и fOutX.

Функция BuildCommDCB, описанная ниже, записывает в это поле значение 0x13 ( ).

Если вы решили изменить принятые по умолчанию значения полей XonChar и XoffChar, следует обратить внимание на то, что они должны содержать различные величины. В противном случае управление потоком при помощи символов XON/XOFF будет работать неправильно и обмен данными может прекратиться.

Поле XonLim

Поле XonLim определяет минимально допустимое число символов в приемной очереди, при принижении которого передается символ XON (если включен протокол XON/XOFF) и устанавливается сигнал DTR (если включен протокол DTR).

Функция BuildCommDCB записывает в это поле значение 0x10.

Поле XoffLim

Поле XoffLim определяет максимально допустимое число символов в приемной очереди, при превышении которого передается символ XOFF (если включен протокол) и сбрасывается сигнал DTR (если включен протокол).

Чтобы определить максимально допустимое количество символов в очереди, надо вычесть из размера очереди приемника значение поля XoffLim.

Функция BuildCommDCB записывает в это поле значение 0x10. Для изменения значения, записанного в поле, можно воспользоваться функцией SetCommState.

Поле PeChar

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

Функция BuildCommDCB записывает в это поле значение 0x0. Смотри поле fPeChar и fParity.

Поле EofChar

Поле EofChar определяет символ EOF, используемый при передаче сигнала «конец данных».

Функция BuildCommDCB записывает в это поле значение 0x0. Смотри поле fBinary.

Поле EvtChar

Поле EvtChar определяет символ, используемый для передачи сигнала событие (EV_RXFLAG). Когда принимается символ EvtChar, генерируется событие EV_RXFLAG. В действительности флаг fChEvt не используется. Необходимо вызвать функцию SetCommEventMask, чтобы разрешить это событие.

Функция BuildCommDCB записывает в это поле значение 0x0.

Поле TxDelay

Поле TxDelay не используется в Windows 3.1 и Windows for Workgroups 3.11.

Как заполнить или модифицировать структуру DCB

На этом мы заканчиваем описание структуры DCB. В заключение приведем несколько советов по модификации полей этой структуры.

Структура DCB заполняется двумя функциями — OpenComm и BuildCommDCB. Однако существует много полей в структуре DCB, которые нельзя изменить с помощью этих функций. Для этого надо непосредственно записать новые значения в поля структуры, а затем воспользоваться функцией SetCommState, чтобы внесенные изменения отразились на работе COM-порта.

Если вам нужно изменить какое-либо поле этой структуры, следует сначала узнать текущее значение полей структуры DCB, с помощью функции GetCommState. Затем внесите все необходимые изменения в поля структуры и вызовите функцию SetCommState, чтобы соответственно изменился режим COM-порта.

Такой алгоритм гарантирует, что остальные поля структуры DCB перед вызовом SetCommState будут содержать правильные значения.

В качестве альтернативного способа изменения структуры DCB можно воспользоваться функцией BuildCommDCB. Этой функции передается в качестве параметра строка, имеющая формат команды MODE операционной системы MS-DOS. Данная строка может содержать значения скорости передачи данных, количества бит данных и стоповых бит в слове.

Функция BuildCommDCB заполняет структуру DCB, но не изменяет состояния COM-порта. Для этого следует воспользоваться функцией SetCommState.

В начале работы с COM-портом приложение должно открыть его с помощью функции OpenComm. Функция OpenComm с помощью функции BuildCommDCB заполняет временный, недоступный программисту, блок DCB значениями по умолчанию. Скорость обмена устанавливается равной 9600 бит/с., проводится проверка на четность, передаваемые символы содержат 7 информационных и один стоповый бит. Затем функция OpenComm выполняет внутренний вызов функции SetCommState с подготовленной структурой DCB, устанавливая начальный режим COM-порта. Затем можно создать собственную структуру DCB и установить новый режим COM-порта, вызвав функцию SetCommState.

Функция SetCommState принимает в качестве параметра указатель на заполненную структуру DCB и устанавливает режим работы COM-порта в соответствии с данными из этой структуры.

Вы также можете узнать текущее состояние COM-порта с помощью функции GetCommState.

7.2.7. Функция BuildCommDCB

Функция BuildCommDCB заполняет структуру DCB в соответствии с переданной ей строкой параметров. Структура DCB содержит управляющую информацию, необходимую для установки режима работы портов последовательного асинхронного адаптера (см. раздел «Структура DCB»).

int BuildCommDCB(LPCSTR lpszDef, DCB FAR* lpdcb);

Параметр lpszDef является дальним указателем на строку символов, закрытую двоичным нулем, которая должна содержать команды установки режима COM-порта. Формат этой строки полностью соответствует параметрам команды MODE операционной системы MS-DOS.

Например, параметр lpszDef может указывать на строку «COM1:9600,n,8,1». В этом случае после вызова функции BuildCommDCB заполненная структура DCB позволит установить порт COM1 в режим обмена данными со скоростью 9600 бит/с, без проверки на четность с форматом передаваемых символов из 8 бит данных и одним стоповым битом.

Параметр lpdcb является дальним указателем на структуру типа DCB. В нее будет записана информация, полученная после интерпретации строки lpszDef.

Функция BuildCommDCB возвращает ноль, если команды, указанные в параметре lpszDef, успешно интерпретированы и структура DCB заполнена. В случае возникновения ошибки, например, в формате команд, функция возвращает -1.

Функция BuildCommDCB только заполняет поля структуры DCB. Чтобы установить режим порта последовательного асинхронного адаптера в соответствии с заполненной структурой DCB, необходимо воспользоваться функцией SetCommState.

С помощью функции BuildCommDCB вы можете управлять далеко не всеми характеристиками COM-порта, определяемыми структурой DCB. Так как формат команд строки lpszDef соответствует команде MODE MS-DOS, то с помощью BuildCommDCB можно изменить только скорость передачи информации, режим проверки на четность и формат передаваемых данных (число стоповых бит и бит данных в передаваемых символах).

Остальные поля структуры DCB функция BuildCommDCB заполняет по собственному усмотрению (см. описание полей структуры DCB в разделе «Структура DCB»). Так, BuildCommDCB запрещает управление потоком данных между модемом и компьютером на аппаратном уровне (сигналы CTS и RTS) и на программном уровне (с помощью символов XON и XOFF).

Кроме того, функция BuildCommDCB позволяет определить только символы длиной 7 или 8 бит. Другие значения вызывают ошибку.

Таким образом, функция BuildCommDCB может быть полезна только в самых простых случаях или для начального заполнения структуры DCB. В большинстве случаев вам потребуется самостоятельно заполнять поля этой структуры.

7.2.8. Функция SetCommBreak

Функция SetCommBreak прекращает передачу данных и переводит COM-порт в состояние BREAK. COM-порт находится в состоянии BREAK до тех пор, пока приложение не вызовет функцию ClearCommBreak.

Параметр idComDev должен содержать идентификатор COM-порта, переводимого в состояние BREAK. В качестве параметра idComDev необходимо использовать величину, возвращаемую функцией OpenComm.

При успешном завершении функция возвращает ноль. Если функция возвращает значение меньшее нуля, произошла ошибка.

7.2.9. Функция ClearCommBreak

Функция ClearCommBreak восстанавливает обмен данными через порт асинхронного последовательного адаптера, прерванный ранее вызовом функции SetCommBreak.

Единственный параметр функции idComDev должен содержать идентификатор порта асинхронного последовательного адаптера, для которого вызывается функция.

Функция возвращает ноль в случае успешного завершения или -1, если параметр idComDev задан неправильно, то есть не соответствует ни одному открытому порту асинхронного последовательного адаптера.

7.2.10. Функция EnableCommNotification

Функция EnableCommNotification разрешает или запрещает передачу сообщения WM_COMMNOTIFY в функцию окна приложения. Более подробную информацию о сообщении WM_COMMNOTIFY можно получить, прочитав раздел «Сообщение WM_COMMNOTIFY».

Прототип функции EnableCommNotification представлен ниже.

Параметр idComDev является идентификатором порта, который будет передавать сообщения WM_COMMNOTIFY в функцию окна. Для параметра idComDev необходимо использовать значение, полученное от функции OpenComm.

Параметр hwnd определяет окно, функции которого будет передаваться сообщение WM_COMMNOTIFY. Если этот параметр содержит значение NULL, функция EnableCommNotification запрещает передачу сообщения WM_COMMNOTIFY в функцию текущего окна.

Параметр cbWriteNotify определяет количество байт, которое драйвер асинхронного последовательного адаптера должен записать во входную очередь перед тем, как будет передано сообщение WM_COMMNOTIFY, у которого в младшем слове параметра lParam записан код извещения CN_RECEIVE . Данное сообщение служит сигналом приложению, что пора прочитать данные из входной очереди COM-порта.

Последний параметр cbOutQueue задает минимальное количество символов (байт) в очереди передатчика. Если в очереди передатчика становится меньше байт, чем определено параметром cbOutQueue, драйвер асинхронного последовательного адаптера передает приложению сообщение WM_COMMNOTIFY, у которого в младшем слове параметра lParam записан код извещения CN_TRANSMIT. Это сообщение означает, что выходная очередь практически пустая и можно поместить в нее очередную порцию данных.

В случае успешного завершения, функция возвращает значение отличное от нуля. Если функция завершилась с ошибками, она возвращает ноль. Причиной возникновения ошибки может послужить вызов функции EnableCommNotification с неправильным идентификатором COM-порта (COM-порт не открыт) или то, что драйвер асинхронного последовательного адаптера не поддерживает функцию EnableCommNotification.

Так, например, драйвер асинхронного последовательного адаптера COMM.DRV операционной системы Windows версии 3.0 не поддерживает эту функцию.

Вы можете запретить передачу функции окна сообщения WM_COMMNOTIFY с кодами извещения CN_RECEIVE и CN_TRANSMIT.

Если задать для параметра cbWriteNotify значение -1, драйвер не будет передавать функции окна сообщение WM_COMMNOTIFY с кодом извещения CN_RECEIVE.

Аналогично, если задать для параметра cbOutQueue значение -1, драйвер не будет передавать функции окна сообщение WM_COMMNOTIFY с кодом извещения CN_TRANSMIT.

Может возникнуть резонный вопрос: что произойдет, если разрешить генерацию сообщения WM_COMMNOTIFY с кодом извещения CN_RECEIVE, задать пороговое значение для передачи сообщения 20 байт, а из COM-порта поступит только 15 байт? Будет ли драйвер ожидать прихода остальных 5 байт и как долго? Не прекратится ли обмен данными?

Драйвер асинхронного последовательного адаптера периодически, с интервалом около 100 миллисекунд, опрашивает все очереди COM-портов. Если при очередном опросе входной очереди в ней будет находится меньше чем cbWriteNotify байт, функции окна все равно передается сообщение WM_COMMNOTIFY с кодом извещения CN_RECEIVE. Таким образом, если во входной очереди находится меньше байт, чем надо для генерации сообщения, функция окна все равно получит сообщение WM_COMMNOTIFY по истечении 100 миллисекунд.

7.2.11. Функция FlushComm

Функция FlushComm удаляет все символы из входной или выходной очереди COM-порта. Прототип функции имеет следующий вид:

Параметр idComDev является идентификатором COM-порта, очередь которого необходимо очистить (сбросить).

Параметр fnQueue определяет очередь, из которой будут удалены все символы. Если значение этого параметра равно нулю, очищается выходная очередь. Если же значение параметра равно единице, удаляются все символы из приемной очереди.

Функция возвращает ноль в случае нормального завершения. Если значение, возвращаемое функцией, меньше нуля, параметр idComDev определяет неоткрытый COM-порт или параметр fnQueue задает несуществующую очередь. Возвращаемое функцией число принимает положительное значение, если возникла ошибка COM-порта. Подробный список возможных ошибок приведен в описании функции GetCommError.

7.2.12. Функция GetCommError

Функция GetCommError позволяет определить текущее состояние COM-порта и причину ошибки при предыдущем вызове коммуникационной функции.

Когда случается ошибка при передаче или приеме данных, Windows блокирует COM-порт до тех пор, пока не будет вызвана функция GetCommError.

Параметр idComDev должен содержать идентификатор порта, который будет проверяться.

Через параметр lpStat передается дальний указатель на структуру типа COMSTAT. В поля этой структуры будет записано состояние COM-порта. В случае если вы вызовете GetCommError с параметром lpStat, равным NULL, функция вернет только значение ошибки.

Структура COMSTAT определена в файле WINDOWS.H следующим образом:

Из приведенного выше листинга видно, что структура COMSTAT определяется по-разному в зависимости от следующего условия:

Если вы создаете загрузочный модуль для операционной системы Windows 3.1 или устанавливаете жесткий режим контроля синтаксиса программы, определив константу STRICT, используется основное определение структуры COMSTAT. Опишем поля структуры COMSTAT при использовании основного определения:

Поле Описание
status Определяет состояние передачи данных. Оно может содержать один или несколько флагов:

CSTF_CTSHOLD

Передача данных приостановлена в ожидании сигнала CTS

CSTF_DSRHOLD

Передача данных приостановлена в ожидании сигнала DSR

CSTF_RLSDHOLD

Передача данных приостановлена в ожидании сигнала RLSD

CSTF_XOFFHOLD Передача данных приостановлена после приема символа XOFF

CSTF_XOFFSENT

Передача данных приостановлена при передаче символа XOFF. Передача приостанавливается, когда символ XOFF передан. CSTF_XOFFSENT используется системами, которые принимают следующий символ XON вне зависимости от настоящего принятого символа

CSTF_EOF

Получен символ конца файла EOF

CSTF_TXIM

Произошла задержка при передаче символа
cbInQue Количество символов, находящихся во входной очереди
cbOutQue Количество символов в выходной очереди

Функция GetCommError возвращает значение, являющееся комбинацией флагов. Флаги определяют ошибки, возникшие при последнем вызове коммуникационной функции.

Возвращаемое значение может быть комбинацией из следующих флагов:

Флаг Описание
CE_BREAK Обнаружено состояние разрыва связи (BREAK)
CE_CTSTO Тайм-аут CTS. Во время передачи символа сигнал CTS отсутствовал дольше промежутка времени, определенного полем fCtsHold структуры COMSTAT
CE_DNS Параллельный порт не был выбран
CE_DSRTO Тайм-аут DSR. Во время передачи символа сигнал DSR отсутствовал промежуток времени, определенный полем fDsrHold структуры COMSTAT
CE_FRAME Обнаружена ошибка формата кадра (framing error)
CE_IOE Во время попытки взаимодействия с параллельным портом произошла ошибка ввода/вывода
CE_MODE Запрашиваемый режим не поддерживается или идентификатор COM-порта недействителен. Если установлен этот флаг, другие флаги следует игнорировать
CE_OOP Параллельный адаптер передал компьютеру сигнал «out of paper» — конец бумаги
CE_OVERRUN Символ не был прочитан из регистров COM-порта до прихода следующего символа. В результате этот символ был потерян
CE_PTO Истекло время (тайм-аут) при выполнении попытки взаимодействия с параллельным устройством
CE_RLSDTO Тайм-аут RLSD. Во время передачи символа сигнал RLSD отсутствовал промежуток времени, определенный полем fRlsdHold структуры COMSTAT
CE_RXOVER Очередь приемника переполнена. Либо очередь приемника переполнена, либо символ был получен после получения символа конца файла
CE_RXPARITY Обнаружена ошибка четности
CE_TXFULL Очередь передатчика полностью заполнена, но функция пытается записать новые данные в эту очередь

7.2.13. Функция SetCommEventMask

Для каждого COM-порта Windows поддерживает слово событий. Оно состоит из набора бит, которые устанавливаются при изменении состояния COM-порта (например, при изменении состояния сигнала CTS). Чтобы при изменении состояния COM-порта соответствующим образом менялось слово состояния, необходимо сначала разрешить регистрацию этих изменений.

Функция SetCommEventMask разрешает регистрацию изменений состояния COM-порта в слове событий данного COM-порта:

UINT FAR* SetCommEventMask(int idComDev, UINT fuEvtMask);

Параметр idComDev является идентификатором COM-порта. Это значение возвращает функция OpenComm.

Параметр fuEvtMask определяет, какие события будут разрешены. Этот параметр может быть комбинацией из любых констант, перечисленных в следующей таблице:

Константа Смысл
EV_BREAK Устанавливается при обнаружении состояния BREAK на входной линии
EV_CTS Устанавливается, когда сигнал CTS изменяет свое состояние
EV_CTSS Указывает текущее состояние сигнала CTS
EV_DSR Устанавливается, когда сигнал DSR изменяет свое состояние
EV_ERR Устанавливается при возникновении ошибки на линии. Такими ошибками являются CE_FRAME, CE_OVERRUN, и CE_RXPARITY (см. описание функции GetCommError)
EV_PERR Устанавливается при возникновении ошибки принтера для параллельного порта. Такими ошибками являются CE_DNS, CE_IOE, CE_LOOP и CE_PTO (см. описание функции GetCommError)
EV_RING Указывает текущее состояние сигнала RI во время последнего прерывания от модема
EV_RLSD Устанавливается, когда сигнал RLSD изменяет свое состояние
EV_RLSDS Указывает текущее состояние сигнала RLSD
EV_RXCHAR Устанавливается, когда символ принимается и помещается во входную очередь
EV_RXFLAG Устанавливается, когда определенный в структуре DCB символ принимается и помещается во входную очередь COM-порта
EV_TXEMPTY Устанавливается, когда последний символ из выходной очереди отправлен в COM-порт и выходная очередь становится пустой

Функция SetCommEventMask возвращает указатель на слово событий данного COM-порта. Каждый бит этого слова отвечает за определенное событие. Если бит установлен, значит соответствующее событие произошло.

В слово событий записываются только события, разрешенные функцией SetCommEventMask.

Воспользовавшись функцией EnableCommNotification, можно разрешить передачу в функцию окна приложения сообщения WM_COMMNOTIFY с кодом извещения CN_EVENT. Это сообщение будет передаваться при изменении слова состояния COM-порта.

7.2.14. Функция GetCommEventMask

Функция GetCommEventMask получает и затем очищает слово события данного COM-порта.

UINT GetCommEventMask(int idComDev, int fnEvtClear);

Параметр idComDev является идентификатором COM-порта.

Параметр fnEvtClear определяет события, которые будут сброшены в слове событий.

Если функция завершается успешно, она возвращает значение слова событий для COM-порта, определенного параметром idComDev. Каждый бит этого слова отвечает за одно конкретное событие. Если данное событие произошло, соответствующий бит равен 1.

Перед тем как функция GetCommEventMask может зарегистрировать возникновение события, приложение должно разрешить данное событие при помощи функции SetCommEventMask.

При возникновении таких событий, как изменение состояния линии или ошибка принтера, вы должны вызвать функцию GetCommError.

7.2.15. Функция GetCommState

Функция GetCommState позволяет узнать режим работы порта асинхронного последовательного адаптера. Прототип функции представлен ниже:

int GetCommState(int idComDev, DCB FAR* lpdcb);

Параметр idComDev должен содержать идентификатор COM-порта. Это значение возвращает функция OpenComm.

Параметр lpdcb является дальним указателем на структуру DCB, в которую будет записана информация о режиме работы COM-порта, указанного в параметре idComDev.

В случае успешного завершения функция GetCommState возвращает нулевое значение. Если при работе функции возникла ошибка, возвращаемая величина меньше нуля.

7.2.16. Функция ReadComm

Функция ReadComm позволяет прочитать данные из входной очереди COM-порта. Прототип функции представлен ниже:

int ReadComm(int idComDev, void FAR* lpvBuf, int cbRead);

Параметр idComDev является идентификатором COM-порта, из которого будут прочитаны данные.

Параметр lpvBuf содержит дальний указатель на буфер, в который будут записаны прочитанные из COM-порта данные.

Последний параметр cbRead задает количество символов, которое следует прочитать из входной очереди порта.

Следите за тем, чтобы значение cbRead не было больше, чем размер буфера lpvBuf

В случае успешного выполнения функции возвращаемое значение определяет количество символов, прочитанное из COM-порта. Если во время выполнения функции произошла ошибка, функция возвращает отрицательное значение. При этом абсолютное значение возвращенной величины определяет количество символов, успешно прочитанных из COM-порта.

В случае возникновения ошибки ее причину можно выяснить с помощью функции GetCommError. Так как ошибка может произойти и в том случае, когда ни один символ из входной очереди не прочитан, то, если ReadComm возвращает нулевую величину, следует вызвать функцию GetCommError, чтобы удостоверится в отсутствии ошибок.

Если величина, возвращаемая функцией меньше чем значение параметра cbRead, это означает, что на момент вызова функции во входной очереди COM-порта находилось символов меньше, чем определено параметром cbRead.

Если величина, возвращаемая функцией равна значению параметра cbRead, то возможно, что в очереди приемника еще находятся данные. Поэтому можно сразу повторно вызвать функцию ReadComm.

В качестве примера использования функции ReadComm мы приводим исходный текст функции ReadCommChar, считывающей из входной очереди один символ:

В качестве параметра для функции ReadCommChar необходимо передать идентификатор COM-порта. Функция ReadCommChar вызывает ReadComm и пытается считать из входной очереди COM-порта один символ.

Если ReadComm возвращает единицу, символ успешно прочитан и функция ReadCommChar возвращает код полученного символа. В противном случае для того, чтобы сбросить флаги ошибок, вызывается функция GetCommError. Затем функция ReadCommChar возвращает -1.

7.2.17. Функция TransmitCommChar

Функция TransmitCommChar помещает символ, заданный параметром chTransmit, в начало выходной очереди COM-порта, определенного параметром idComDev. Прототип функции представлен ниже.

int TransmitCommChar(int idComDev, char chTransmit);

Функция возвращает нулевое значение в случае успешного завершения или отрицательное значение, если символ не записан в выходную очередь. Функцию нельзя вызывать повторно, если COM-порт не производит передачу данных. После того как функция TransmitCommChar записала символ в начало выходной очереди, необходимо, чтобы перед повторным вызовом функции этот символ был передан.

Если предыдущий символ не был передан, перед повторным вызовом функции TransmitCommChar, функция завершается с ошибкой.

В следующем примере функция TransmitCommChar используется для передачи символов, набранных на клавиатуре в COM-порт.

7.2.18. Функция UngetCommChar

Функция позволяет поместить символ в начало входной очереди. При выполнении последующей операции чтения функция ReadComm прочитает этот символ. Прототип функции UngetCommChar представлен ниже:

int UngetCommChar(int idComDev, char chUnget);

Первый параметр функции idComDev должен содержать идентификатор COM-порта.

Параметр chUnget должен содержать символ, помещаемый во входную очередь COM-порта.

Функция возвращает нулевое значение в случае успешного завершения или отрицательное значение при возникновении ошибки.

Последовательные вызовы функции UngetCommChar не допускаются. Перед тем как вы сможете вызвать функцию UngetCommChar еще раз, символ, помещенный в очередь приемника, должен быть прочитан.

7.2.19. Функция WriteComm

Функция WriteComm записывает символы в выходную очередь COM-порта. Прототип функции представлен ниже:

Параметр idComDev содержит идентификатор COM-порта, используемого для передачи данных.

Параметр lpvBuf является дальним указателем на буфер, содержащий передаваемые данные.

Последний параметр функции cbWrite определяет количество символов в буфере lpvBuf, предназначенных для передачи.

Обратите внимание на то, что значение параметра cbWrite не должно быть больше, чем размер буфера lpvBuf

В случае успешного выполнения функции возвращаемое ей значение определяет количество символов, записанное в выходную очередь COM-порта. Если во время выполнения функции произошла ошибка, функция возвращает отрицательное значение. Абсолютное значение возвращаемой величины определяет количество символов, успешно записанных в выходную очередь.

В случае возникновения ошибки ее причину можно выяснить с помощью функции GetCommError.

Если в очереди передатчика недостаточно места, функция WriteComm может удалить данные из этой очереди. Поэтому перед вызовом функции WriteComm приложение должно проверить наличие достаточного свободного пространства в очереди передатчика. Для этого следует воспользоваться функцией GetCommError.

При открытии COM-порта функцией OpenComm следует указать размер выходной очереди не меньше, чем максимальный предполагаемый размер передаваемых строк.

В качестве примера использования функции WriteComm мы приводим исходный текст функции WriteCommChar, записывающей в выходную очередь один символ:

В качестве первого параметра функции WriteCommChar передается идентификатор COM-порта, в который необходимо передать символ. Второй параметр должен содержать код передаваемого символа.

Функция WriteCommChar вызывает функцию WriteComm и пытается записать в выходную очередь COM-порта один символ.

Если WriteComm возвращает единицу, значит символ успешно записан и функция WriteCommChar возвращает значение TRUE. В противном случае для того чтобы сбросить флаги ошибок вызывается функция GetCommError и WriteCommChar возвращает FALSE.

7.2.20. Сообщение WM_COMMNOTIFY

Сообщение WM_COMMNOTIFY отправляется драйвером COM-порта в функцию окна и служит извещением об изменении состояния COM-порта. Такое сообщение может поступать в функцию окна при наполнении входной очереди до определенного порогового значения, изменении состояния сигналов DTR, RI, RTS и т. д.

Параметр wParam сообщения WM_COMMNOTIFY определяет идентификатор COM-порта, вызвавшего отправку сообщения.

Через младшее слово параметра lParam функция окна получает число, по которому можно судить о причине посылки сообщения WM_COMMNOTIFY. Это число может быть комбинацией следующих кодов извещения:

Код извещения Описание
CN_EVENT Произошло событие, разрешенное в слове событий COM-порта. Эти события разрешаются вызовом функции SetCommEventMask. После прихода сообщения WM_COMMNOTIFY с кодом извещения CN_EVENT приложение должно вызвать функцию GetCommEventMask, чтобы определить, какое именно событие произошло и сбросить событие
CN_RECEIVE Очередь приемника содержит больше, чем cbWriteNotify байт. Пороговое значение cbWriteNotify задается одним из параметров функции EnableCommNotification
CN_TRANSMIT Очередь передатчика содержит меньше, чем cbOutQueue байт. Пороговое значение cbOutQueue задается одним из параметров функции EnableCommNotification

Если приложение обработало поступившее ему сообщение WM_COMMNOTIFY, оно должно возвратить нулевое значение.

Сообщение WM_COMMNOTIFY с кодом извещения CN_EVENT передается только тогда, когда слово состояния событий изменяет свое значение. Приложение, которое принимает сообщение WM_COMMNOTIFY, должно каждый раз очищать слово состояния событий, для того чтобы гарантировать получение сообщений в дальнейшем.

Использование функции EnableCommNotification для разрешения передачи сообщений WM_COMMNOTIFY с кодами извещения CN_RECEIVE и CN_TRANSMIT может вызвать генерацию ошибочных сообщений WM_COMMNOTIFY, для которых параметр NotifyStatus равен нулю. При обмене данными на высоких скоростях это может привести к аварийной ситуации и даже перезагрузке компьютера.

Для решения этой проблемы можно использовать следующие методы:

  • Игнорировать все сообщения WM_COMMNOTIFY, для которых параметр NotifyStatus равен нулю
  • Не использовать сообщения WM_COMMNOTIFY для событий CN_RECEIVE и CN_TRANSMIT
  • Разрешить сообщение CN_EVENT для события EV_RXCHAR с помощью функций SetCommEventMask и EnableCommNotification. Сообщение формируется при поступлении во входную очередь очередного символа. Функцию EnableCommNotification следует вызывать с параметрами cbWriteNotify и cbOutQueue -1, чтобы сообщения CN_RECEIVE и CN_TRANSMIT не посылались. Этот метод продемонстрирован в приложении TTY из Windows Software Development Kit (SDK)
  • Вместо использования функции EnableCommNotification приложение должно само периодически опрашивать входной буфер на наличие в нем принятых данных. Опрос можно производить по таймеру или в цикле обработки сообщений
  • Заменить драйвер последовательного асинхронного адаптера COMM.DRV.

    Событие CN_RECEIVE формируется в тех случаях, когда количество байт во входной очереди превышает пороговое значение cbWriteNotify, установленное функцией EnableCommNotification, или когда истекло время (тайм-аут). После формирования события CN_RECEIVE в случае превышения пороговой величины cbWriteNotify другие сообщения CN_RECEIVE не будут генерироваться до тех пор, пока количество байт во входной очереди не станет меньше значения cbWriteNotify и не превысит ее снова.

    Сообщение CN_TRANSMIT создается аналогично CN_RECEIVE. Порог устанавливается параметром cbOutQueue функции EnableCommNotify. Когда количество символов в выходной очереди становится меньше, чем cbOutQueue, формируется сообщение CN_TRANSMIT. Другие сообщения CN_TRANSMIT не будут посылаться до тех пор, пока в буфере не станет больше, чем cbOutQueue символов.

    Однако, если прерывания поступают достаточно быстро, дополнительные сообщения CN_RECEIVE (или CN_TRANSMIT) могут посылаться до того, как количество символов в выходной очереди станет больше, чем cbWriteNotify. Эти сообщения можно пропускать (игнорировать), однако они могут послужить причиной перезагрузки системы.

    Ниже приведен фрагмент обработчика сообщения WM_COMMNOTIFY:

    При загрузке драйвера последовательного асинхронного адаптера он вызывает функцию CreateSystemTimer и создает таймер, посылающий сообщения драйверу каждые 100 миллисекунд. Обрабатывая сообщения таймера, драйвер просматривает состояние всех открытых COM-портов и проводит проверку тайм-аута. Период таймера изменить нельзя.

    7.3. Приложение EASYTTY

    Наше первое телекоммуникационное приложение EASYTTY демонстрирует использование функций Windows, предназначенных для работы с портами асинхронного последовательного адаптера и модемами.

    Приложение EASYTTY выполняет все основные функции, которые должна поддерживать любая телекоммуникационная программа. EASYTTY позволяет передавать модему AT-команды, принимать от него ответ и отображать его на экране.

    Перед тем как запускать приложение EASYTTY на вашем компьютере, следует создать в каталоге Windows файл EASYTTY.INI (см. листинг 7.6). Если вместе с книгой вы приобрели дискету, то скопируйте файл EASYTTY.INI из каталога WIN\EASYTTY в каталог Windows.

    Листинг 7.6. Файл EASYTTY.INI

    Файл EASYTTY.INI должен состоять из одного раздела [Port], содержащего единственную строку Mode. В этой строке определяется номер COM-порта, к которому подключен модем, скорость обмена и формат передаваемых данных. Формат строки Mode совпадает с форматом команды MODE операционной системы MS-DOS.

    Запустите EASYTTY. Набирая на клавиатуре AT-команды модема, можно перевести его в любой режим. Например, можно сбросить текущую конфигурацию. Для этого введите команду ATZ и нажмите клавишу . В ответ на введенную команду модем загрузит конфигурацию, принятую по умолчанию и вернет компьютеру ответ OK (см. рис. 7.2).

    Чтобы приложение EASYTTY могло автоматически отвечать на вызов по телефонной линии, передайте модему команду ATS0=1 и нажмите клавишу . Поэкспериментируйте с приложением EASYTTY, передавая модему различные команды и наблюдая на экране ответные сообщения.

    Рис. 7.2. Приложение EASYTTY

    Вы можете передать модему команду набора номера удаленного абонента. Чтобы набрать номер 777-77-77, достаточно ввести команду ATDP 777-77-77 и нажать клавишу .

    После установления связи с удаленным модемом вы можете обменяться с ним текстовыми сообщениями. Набирайте передаваемый текст на клавиатуре и просматривайте ответ от удаленного компьютера в главном окне приложения.

    Когда вы закончите сеанс связи с удаленным компьютером, переведите модем в командный режим и передайте ему команду ATH0. Модем повесит трубку и отключится от телефонной линии.

    Чтобы перевести модем из режима передачи данных в командный режим, подождите 2-3 секунды, наберите на клавиатуре три знака ‘+’ и дождитесь от модема ответа OK.

    Главный файл приложения EASYTTY приведен в листинге 7.7.

    Листинг 7.7. Файл EASYTTY.CPP

    Особенностью приложения EASYTTY является использование интерфейса EasyWin, предоставляемого средой разработки Borland C++ for Windows версии 3.1. Интерфейс EasyWin позволяет сократить до минимума код, требуемый для создания окна, вывода в него принимаемых данных и получения ввода с клавиатуры.

    После запуска приложения EASYTTY, функция WinMain выполняет инициализацию интерфейса EasyWin. Для этого вызывается функция _InitEasyWin, описанная во включаемом файле STDIO.H:

    После вызова этой функции появляется главное окно приложения. Теперь можно вызывать стандартные функции консольного ввода/вывода — puts, kbhit, getch, putch.

    Затем функция WinMain вызывает функцию InitCommPort, определенную в приложении. Эта функция считывает из раздела [Port] файла PHONE.INI строку Mode, которая определяет номер COM-порта, к которому подключен модем и его режим работы. Потом InitCommPort открывает соответствующий порт и устанавливает его режим. Затем функция завершает свою работу и возвращает идентификатор открытого COM-порта.

    Если COM-порт не открыт, то идентификатор открытого COM-порта равен нулю и приложение сразу завершает работу.

    После того как порт открыт, вызывается функция puts:

    puts( «Для завершения приложения нажмите клавишу » );

    Она выводит в окне приложения строку «Для завершения приложения нажмите клавишу «. Затем следует цикл while в котором вызывается функция PeekMessage и функция ProcessExchange, определенная в нашем приложении:

    Функция PeekMessage образует цикл обработки сообщений, благодаря которому одновременно могут работать и другие приложения Windows.

    Функция ProcessExchange является сердцем приложения EASYTTY. Она организует весь диалог пользователя с приложением. Для этого она считывает данные из входного буфера COM-порта, поступающие в него от модема, и отображает их в окне приложения. Если вы нажимаете на клавиши, функция ProcessExchange передает код клавиши в выходной буфер COM-порта.

    Если вы нажмете клавишу , функция ProcessExchange вызывает функцию CloseCommPort, определенную в приложении, а затем закрывает главное окно приложения, вызывая функцию DestroyWindow.

    Теперь рассмотрим более подробно функции InitCommPort, ProcessExchange и CloseCommPort, определенные в приложении.

    Функция InitCommPort считывает из раздела [Port] файла EASYTTY.INI строку Mode, определяющую режим работы COM-порта и записывает ее в буфер szCommSettings. Если файл EASYTTY.INI не обнаружен в каталоге Windows или в нем не определена строка Mode, в буфер szCommSettings записывается строка «COM1:9600,n,8,1».

    Затем из строки в буфере szCommSettings выделяются первые четыре символа, задающие номер COM-порта для последующей передачи его функции OpenComm. Функция OpenComm открывает этот COM-порт.

    Если COM-порт не открыт, OpenComm возвращает отрицательное значение. Функция отображает предупреждающее сообщение «Ошибка открытия порта. » и завершает работу.

    Если COM-порт успешно открыт, удаляем все символы из входной и выходной очередей:

    Затем заполняем структуру dcbCommPort типа DCB в соответствии с командной строкой Mode из раздела [Port] файла EASYTTY.INI. Для этого используем функцию BuildCommDCB, передав ей строку szCommSettings:

    Если BuildCommDCB возвращает значение, не равное нулю, значит произошла ошибка. В этом случае выводим сообщение «Ошибка при заполнении структуры DCB» и завершаем функцию, возвращая число -1.

    В случае успешного выполнения функции BuildCommDCB устанавливаем новый режим COM-порта в соответствии с подготовленной структурой DCB:

    Если SetCommState возвращает ненулевое значение, значит произошла ошибка. В этом случае выводим сообщение «Ошибка установки режима COM-порта» и завершаем функцию InitCommPort, возвращая число -1.

    Если функция SetCommState завершилась успешно, функция InitCommPort завершает работу и возвращает идентификатор открытого COM-порта. Позже полученный идентификатор COM-порта передается функциям ProcessExchange и CloseCommPort.

    Функция ProcessExchange вызывает GetCommError, заполняющую структуру ComStat типа COMSTAT:

    Поле cbInQue структуры ComStat будет определять количество символов во входной очереди используемого нами COM-порта. Если во входной очереди есть данные, считываем их и выводим их в окно приложения:

    Если входная очередь COM-порта пуста, с помощью стандартной функции консольного ввода/вывода kbhit проверяем, нажата ли какая-нибудь клавиша на клавиатуре.

    В случае, если клавиша нажата, определяем ее код:

    Проверяем, нажата ли клавиша . Если нажата клавиша , закрываем COM-порт с помощью функции CloseCommPort и возвращаем значение FALSE:

    Если пользователь нажал любую другую клавишу, записываем ее код в выходную очередь COM-порта:

    nCharWriting = WriteComm( idCommPort, ( LPSTR )&keyHit, 1 );

    На этом работа функции завершена, и мы переходим к рассмотрению функции CloseCommPort.

    Функция CloseCommPort наиболее простая из функций приложения EASYTTY. Она удаляет все символы из входной и выходной очереди COM-порта, а затем закрывает COM-порт и возвращает управление:

    Файл определения модуля для приложения EASYTTY приведен в листинге 7.8.

    Листинг 7.8. Файл EASYTTY.DEF

    7.4. Приложение PHONE

    Телекоммуникационное приложение EASYTTY демонстрирует основные приемы использования функций Windows, предназначенных для работы с портами асинхронного последовательного адаптера.

    Приложение PHONE создано специально для работы с модемами и демонстрирует приемы передачи модему AT-команд и автоматического реагирования на ответ модема. Главная диалоговая панель приложения представляет собой панель телефонного аппарата и показана на рисунке 7.3.

    Рис. 7.3. Приложение PHONE

    Вы можете набрать на клавиатуре, расположенной в левой части диалоговой панели «Телефон», любой телефонный номер. Введенный номер отображается в специальном поле справа вверху. Если цифра номера введена неправильно, ее можно стереть, нажав на кнопку » . В ответ на введенную команду модем загрузит принятую по умолчанию конфигурацию и вернет компьютеру ответ OK.

    Чтобы приложение TELETYPE могло автоматически отвечать на вызов по телефонной линии, передайте модему команду ATS0=1 и нажмите клавишу . Поэкспериментируйте с приложением TELETYPE, передавая модему различные команды и наблюдая на экране ответные сообщения.

    Рис. 7.4. Приложение TELETYPE

    Вы можете передать модему команду набора номера удаленного абонента. Чтобы набрать номер 987-65-43 достаточно ввести команду ATDP 987-65-43 и нажать клавишу .

    После установления связи с удаленным модемом вы можете обменяться с ним текстовыми сообщениями. Набирайте передаваемый текст на клавиатуре и просматривайте ответ от удаленного компьютера в главном окне приложения.

    Когда вы закончите сеанс связи с удаленным компьютером, переведите модем в командный режим и передайте ему команду ATH0. Модем повесит трубку и отключится от телефонной линии.

    Чтобы перевести модем из режима передачи данных в командный режим, подождите 2-3 секунды, наберите на клавиатуре три знака ‘+’ и дождитесь от модема ответа OK. Внешний вид главного окна приложения TELETYPE представлен на рисунке 7.4.

    Главный файл приложения TELETYPE приведен в листинге 7.16. После запуска TELETYPE управление получает главная функция приложения WinMain.

    Если параметр hPrevInstance функции WinMain равен нулю, WinMain вызывает функцию инициализации приложения InitApp. В противном случае на экран выводится сообщение о невозможности запуска второй копии приложения.

    Функция InitApp регистрирует класс окна WMODEM и возвращает управление функции WinMain. На базе зарегистрированного класса окна создается и отображается главное окно приложения, после чего запускается обычный цикл обработки сообщений.

    При создании окна в функцию окна передается сообщение WM_CREATE. Получив это сообщение, функция окна вызывает функцию InitTTY, которая определяет различные параметры окна и сохраняет их в глобальных переменных. Затем вызывается функция PostMessage, которая отправляет сообщение WM_CONNECT функции главного окна приложения. Сообщение WM_CONNECT определено во включаемом файле TELETYPE.H следующим образом:

    #define WM_CONNECT WM_USER

    Константа WM_USER специально предназначена для определения приложениями своих собственных кодов сообщений.

    Обработчик сообщения WM_CONNECT вызывает функцию InitCommPort. Эта функция открывает и инициализирует COM-порт в соответствии с данными из файла TELETYPE.INI, разрешает генерацию драйвером COM-порта сообщений WM_COMMNOTIFY и устанавливает сигнала DTR.

    После обработки сообщения WM_CONNECT можно набирать на клавиатуре текст. Для получения ввода с клавиатуры наше приложение обрабатывает сообщение WM_CHAR, вызывая функцию UserChat, которая передает код введенного символа драйверу COM-порта и отображает его на экране.

    Меню приложения TELETYPE содержит две строки: «Информация» и «Выход». При выборе строки «Информация» на экране отображается короткая информация о приложении.

    Когда вы закончите работать с TELETYPE, завершите приложение, выбрав из меню строку «Выход». В этом случае вызывается функция PostMessage, передающая функции окна сообщение WM_CLOSE.

    Обработчик сообщения WM_CLOSE вызывает функцию CloseCommPort, которая закрывает COM-порт и завершает приложение.

    Листинг 7.16. Файл TELETYPE.CPP

    В файле CONNECT.CPP (см. листинг 7.17) содержится определение функции UserChat. Эта функция предназначен для обработки сообщения WM_CHAR, поступающего функции окна в ответ на ввод с клавиатуры.

    Функция UserChat проверяет, нажал ли пользователь клавишу ( ). Если нажал, то в рабочий массив szTemp записываются три символа ‘\r’, ‘\n’ и ‘\0’. Таким образом, в szTemp записывается строка «\r\n». В противном случае в szTemp записывается только код нажатой клавиши, содержащийся в параметре wParam и символ ‘\0’.

    Строка, подготовленная в массиве szTemp, передается в COM-порт и далее модему.

    WriteComm( idOpenCommPort,(LPSTR)szTemp, lstrlen((LPCSTR)szTemp));

    После вызова функции WriteComm приложение вызывает функцию GetCommError, которая сбрасывает код ошибки, если таковая случилась при передаче. В нашем приложении полученный код ошибки не обрабатывается.

    Переданная модему строка не отображается автоматически в окне приложения. Для этого строка, записанная в szTemp, передается функции WriteTTY, определенной в файле TTY.CPP.

    WriteTTY( szTemp, hwnd, DARK_BLUE );

    Первый параметр функции WriteTTY должен содержать строку, которую надо отобразить на экране, второй параметр — идентификатор окна и третий — цвет отображаемой строки. Мы указали в качестве третьего параметра константу DARK_BLUE, соответствующую синему цвету. Константы DARK_BLUE и DARK_GREEN, используемые в нашем приложении определены в файле TELETYPE.H.

    Листинг 7.17. Файл CONNECT.CPP

    В файле COMMPORT.CPP (см. листинг 7.18) определены основные функции, непосредственно взаимодействующие с COM-портом — InitComPort, CloseComPort и ReadCommPort.

    Функция InitComPort выполняет все действия по инициализации COM-порта. Рассмотрим ее более подробно.

    Сначала InitComPort определяет режим работы COM-порта, для этого она считывает строку Mode из раздела Port файла TELETYPE.INI. Затем функция OpenComm открывает соответствующий COM-порт.

    Потом функция BuildCommDCB заполняет структуру DCB, которая передается функции SetCommState. Функция SetCommState устанавливает новый режим работы порта. Сразу после открытия COM-порта в его буферах могут остаться данные. Чтобы их удалить, мы использовали функцию FlushComm.

    В приложении TELETYPE мы обрабатываем сообщения WM_COMMNOTIFY, вырабатываемые драйвером COM-порта. Для того чтобы разрешить генерацию этих сообщений, предназначена функция EnableCommNotification.

    if(!EnableCommNotification(idCommPort,hwnd,32,-1)) return -1;

    После вызова EnableCommNotification функции окна будут поступать сообщения WM_COMMNOTIFY с кодом извещения CN_RECEIVE, если во входную очередь COM-порта поступило больше 32 символов или истек тайм-аут. Более подробную информацию о функции EnableCommNotification можно получить в разделах «Функция EnableCommNotification» и «Сообщение WM_COMMNOTIFY».

    Затем вызывается функция EscapeCommFunction, которая устанавливает сигнал DTR, сообщая модему, что компьютер готов к обмену данными.

    На этом функция InitCommPort заканчивает свою работу и возвращает вызывающей процедуре идентификатор открытого COM-порта.

    Самая простая функция нашего приложения, предназначенная для работы с COM-портами, называется CloseComPort. Она сбрасывает сигнал DTR и закрывает COM-порт.

    В файле COMMPORT.CPP также определена функция ReadComPort, предназначенная для чтения данных из выходной очереди COM-порта.

    Функция имеет три параметра. Первый параметр idComDev определяет идентификатор COM-порта, из которого будут прочитаны данные. Второй параметр szDest должен содержать адрес буфера, в который будет записана поступающая информация, а последний параметр nLength указывает размер этого буфера.

    Функция ReadCommPort содержит внутри себя цикл, в котором происходит чтение данных из выходной очереди COM-порта. Мы выполняем чтение из входной очереди в цикле, так как при больших скоростях передачи информации (больше 9600 бит/с) за время чтения данных из очереди, в нее могут поступить новые данные.

    В цикле сначала вызывается функция GetCommError. Она заполняет структуру ComStat типа COMSTAT. Нас интересует только поле cbInQue этой структуры. В нем записано, сколько байт находится во входной очереди COM-порта. Если в очереди есть данные, считываем их, вызывая функцию ReadComm. В противном случае выходим из цикла чтения и возвращаем вызывающей процедуре количество прочитанных байт.

    Листинг 7.18. Файл COMMPORT.CPP

    Предусмотрены четыре функции, предназначенные для работы с главным окном приложения TELETYPE. Их имена — InitTTY, WriteTTY, SetFocusTTY, KillFocusTTY. Эти функции определены в файле TTY.CPP (см. листинг 7.20). Так как указанные функции не содержат ничего, непосредственно относящегося к COM-портам, мы опишем их кратко.

    Функция InitTTY определяет размеры окна приложения в символах. Главное окно приложения не может изменять свой размер. Поэтому функцию InitTTY достаточно вызвать в начале работы приложения. Прототип функции представлен ниже:

    void InitTTY(HWND hwnd);

    Функция InitTTY имеет только один параметр hwnd, который должен содержать идентификатор главного окна приложения. Это значение возвращается функцией CreateWindow.

    Функция WriteTTY предназначена для отображения данных в главном окне приложения. Прототип функции:

    Первый параметр lpOutString должен содержать указатель на строку символов, закрытую двоичным нулем. Эта строка будет выведена на экран.

    Второй параметр hwnd должен содержать идентификатор главного окна приложения.

    Последний параметр функции WriteTTY — rgbColor. Он определяет цвет символов, которые будут отображаться на экране. В приложении TELETYPE символы, полученные от модема, отображаются зеленым цветом, а символы набираемые пользователем на клавиатуре и передаваемые модему — синим.

    Функции SetFocusTTY и KillFocusTTY управляют текстовым курсором, отображаемым в окне приложения. Функция SetFocusTTY отображает курсор, а функция KillFocusTTY — убирает его из окна приложения. Прототипы функций SetFocusTTY и KillFocusTTY аналогичны:

    void SetFocusTTY(HWND hwnd); void KillFocusTTY(HWND hwnd);

    Эти функции имеют единственный параметр hwnd, который должен содержать идентификатор главного окна приложения.

    Листинг 7.20. Файл TTY.CPP

    Включаемый файл TELE.H (см. листинг 7.21) содержит определения констант, идентификаторов и глобальных переменных, а также объявления функций, используемых в приложении.

    Листинг 7.21. Файл TELE.H

    В листинге 7.23 приведено изображение пиктограммы, расположенной в файле TELETYPE.ICO, на который ссылается оператор ICON в файле описания ресурсов TELETYPE.RC.

    Листинг 7.23. Файл TELETYPE.ICO

    Файл определения модуля для приложения TELETYPE приведен в листинге 7.24.

    Что такое код УКТ ВЭД и для чего он нужен

    Главная Информация Что такое код УКТ ВЭД и для чего он нужен

    Для тех, кто имеет отношение к внешнеэкономической деятельности, термины «код товара», «код УКТ ВЭД», «классификация товара» и др уже давно знакомы. В начале 2020 года с классификацией товаров познакомились и представители «внутреннего» бизнеса, ведь с января 2020 код товара согласно УКТ ВЭД нужно указывать также и в налоговых накладных. Поэтому предлагаем сначала разобраться с базовыми терминами, после этого рассмотреть алгоритм классификации товара, наиболее распространены споры по классификации и как их избежать.

    Что такое УКТ ВЭД?

    УКТ ВЭД — сокращение от Украинской классификации товаров внешнеэкономической деятельности. Она разработана на основе Гармонизированной системы описания и кодирования товаров и Комбинированной номенклатуры Европейского Союза. УКТ ВЭД совпадает с Гармонизированной системой на уровне шести знаков, а с Комбинированной номенклатуре ЕС — на уровне восьми знаков товарного кода.

    УКТ ВЭД фактически состоит из:

    1) набора кодов товаров;
    2) описаний товаров, соответствующих этим кодам;
    3) правил и объяснений как классифицировать товары по тем или иным кодами.

    Суть классификации товаров заключается в следующем. Каждому товару, который перемещают через границу, присваиваются 10-значный код. Это делают для того, чтобы однозначно идентифицировать товар, определить ставку пошлины и меры контроля, которые нужно применить. Кроме этого, присвоение кода упрощает ведение таможенной статистики.

    Каждому коду товара соответствует определенная ставка пошлины. УКТ ВЭД вместе со ставками пошлин составляют Таможенный тариф Украины, утвержденный Законом Украины «О Таможенном тарифе Украины» №584-VII от 19.09.2013.

    Какова структура кода УКТ ВЭД?

    Десятизначный код товара включает:

    код товарной группы (первые 2 цифры)
    код товарной позиции (первые 4 цифры)
    код субпозиции (первые 6 цифр)
    код товарной категории (первые 8 цифр)
    код товарной подкатегории (первые 10 цифр).
    Вся УКТ ВЭД поделена на 21 раздел и 97 товарных групп. Разделы обозначаются римскими цифрами и, в отличие от группы, цифры раздела не отражены в структуре кода товара. Названия разделов и групп приводятся исключительно для удобства пользования УКТ ВЭД. Каждая группа делится на соответствующие товарные позиции, субпозиции, категории и подкатегории.

    Количество групп в разделах и количество товарных позиций в группах очень различаются. Раздел XIX «Оружие и боеприпасы; их части и принадлежности »содержит только одну одноименную группу 93. Зато Раздел I« Живые животные; продукты животного происхождения »включает 5 групп: Группа 01« Живые животные », Группа 02« Мясо и съедобные субпродукты », Группа 03« Рыба и ракообразные, моллюски и прочие водные беспозвоночные », Группа 04« Молоко и молочные продукты; яйца птицы; натуральный мед; пищевые продукты животного происхождения, в другом месте не поименованные », Группа 05« Другие продукты животного происхождения, в другом месте не поименованные ».

    На что влияет код УКТ ВЭД?

    Код товара влияет на применение к данному товару тарифных и нетарифных мер.

    Как можно понять из названия, тарифные меры — это пошлины и другие платежи, взимаемые при перемещении товаров через таможенную границу. От классификации товара по тем или иным кодом УКТ ВЭД напрямую зависит размер ввозной пошлины. Каждому коду товара соответствует своя ставка ввозной пошлины, даже если она и равна 0%.

    При импорте подакцизных товаров кроме пошлины нужно уплатить еще и акцизный налог. Перечень таких товаров приведен в Налоговом кодексе Украины (статья 215). А на размер ставки акцизного налога также может повлиять код товара по ТН ВЭД.

    Поэтому с тарифными мерами все понятно — изменение кода УКТ ВЭД может привести к «удорожанию» товара. Зато нетарифные меры вообще могут сделать ввоз или вывоз такого товара невозможно.

    Нетарифные меры — это любые ограничения и запреты на перемещение товаров через границу, не связанные с применением пошлин. Такие ограничения могут иметь различную форму. Так, в определенных случаях необходимо пройти дополнительную форму контроля (экологический, фитосанитарный и др.), Сертифицировать товар, подтвердить соответствие тому или иному техническому регламенту, разрешить определенного органа, лицензию или иной документ.

    Не все нетарифные меры напрямую зависят от классификации товара. Однако приведем один интересный пример, который покажет насколько изменение кода товара влияет на перечень разрешительных документов, необходимых для таможенного оформления. Несколько лет назад таможенные органы внезапно начали менять коды медицинских спиртовых настоек и классифицировать их как алкогольные напитки. Для импорта алкогольных напитков нужна лицензия. В импортеров такой лицензии не было, ведь эти спиртовые настойки были лекарственными средствами, а не алкогольными напитками. Они были вынуждены временно приостановить импорт таких товаров.

    Когда нужно определить код товара?

    Очень часто о классификации товара вспоминают уже перед таможенным оформлением. Так не стоит делать. Определять код товара нужно еще до подписания контракта. Это позволит правильно описать товар в товаросопроводительных документах, получить все сведения от поставщика и минимизировать риски изменения кода товара инспекторами таможни.

    В следующих статьях выясним: как классифицировать товары; что такое предварительное решение о классификации товара; как таможня проверяет правильность классификации; как защищать свой код в споре с таможней; а также ответим на другие интересные вопросы классификации.

    Исправление Android-ошибки Неверный код MMI или неполадки подключения

    Пользователи смартфонов на Android довольно часто сталкиваются с непонятной ошибкой при работе устройства. Отображается сообщение: «Неполадки подключения или неверный код MMI». В результате устройство неспособно отправлять сообщения или совершать звонки до тех пор, пока проблема не будет решена.

    Существует несколько основных причин, которые могут вызывать данную проблему. Соответственно, способы решения разные. Но в этом руководстве мы собрали все действенные способы, согласно отзывам и комментариям пользователей на специализированных форумах и сайтах, и представляем их вашему вниманию.

    Навигация на странице:

    Что такое код MMI и почему появляется ошибка?

    MMI представляет собой специальный служебный код, который связывает конкретный USSD-запрос абонента сотовой связи с тем или иным предложением оператора. То есть, когда вы отправляете цифровую комбинацию для проверки баланса своего номера, для активации или деактивации тарифного плана или какой-либо услуги, и при этом он сформируется неверно или выйдет ошибка, то на экране устройства вы увидите сообщение об ошибке: «Неверный код MMI».

    Явление подобного рода может произойти при использовании услуг любого сотового оператора: Билайн, МТС, Теле2, Мегафон, и т.д. При этом марка и модель смартфона тоже никак не влияет на это. Хотя было замечено, что очень часто появляется на Samsung.

    Чаще всего проблема возникает из-за сбоев в сети самого оператора или Сим-карты. Иногда виноват и сам пользователь, если допустил ошибку при отправке USSD запроса. Поэтому нужно быть в любом случае внимательным. Еще бывает такое, что оператор прекратил предоставление какой-то услуги и прикрепленный за ней USSD-запрос больше недействителен (проверяйте актуальность услуг на сайте своего оператора).

    Что делать пользователю?

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

    Решение №1: Использование функции «Режим полета»

    Если неполадки подключения появилась на вашем устройстве только первый раз, то самое первое и простое, что нужно делать — отключить на некоторое время сеть, активировав «Режим полета».

    Для быстроты операции можете открыть шторку уведомлений и найти иконку самолета. Включите «Режим полета» примерно на 10-15 секунд, а затем выключите и проверьте результат.

    Если вам удобнее работать через меню «Настройки» смартфона, то данный режим можно найти в разделе «Сеть и интернет». Перетащите ползунок в состояние «Вкл» и через несколько секунд выключите.

    Решение №2: Перезагрузка устройства

    Еще один довольно простой способ решения проблемы – перезагрузка операционной системы Андроид. В некоторых случаях работает отлично. Однако, если вам не повезло и сообщение об ошибке все еще беспокоит вас, попробуйте решить его с помощью изменения настроек.

    Решение №3: Настройка функции «Помощь в наборе номера»

    Некоторые телефоны Андроид обладают функцией принудительного добавления кода вашего сотового оператора к набранному номеру или USSD-запросу. В результате обновления прошивки или некоторых других действий при эксплуатации устройства, включается эта опция. Необходимо деактивировать ее, просто убрав галочку, или пересунуть ползунок в положение «Выключено».

    1. Запустите меню «Настройки».
    2. Найдите раздел «Настройки приложений» и выберите «Системные приложения». Здесь нас интересует пункт под названием «Вызовы».
    3. Теперь найдите и откройте «Настройки местоположения». Здесь должен быть пункт «Помощь в наборе номера».
    4. Отключите опцию «Добавлять код страны», которая в автоматическом режиме добавляет код страны перед вызовом.

    Решение №4: Изменение режима работы сети

    Если уровень сигнала сети низкий или нестабильный, ваш смартфон будет искать более сильный сигнал. Он постоянно меняет свой сетевой формат — 4G, 3G, WCDMA, EDGE. Глядя на экран, вы можете наблюдать, как индикаторы типа сети меняются над значком индикатора уровня сигнала. Вам нужно попробовать переключиться с одного режима на другой или замедлить скорость.

    Перейдите в «Настройки» -> «Сеть и интернет» -> «Мобильная сеть» -> «Расширенные настройки» -> «Предпочтительный тип сети», и выберите 3G или даже 2G.

    Решение №5: Выбор сим-карты

    Этот способ решения проблемы с неверным кодом MMI актуален только для пользователей, у которых смартфон с двумя сим-картами. Здесь есть два варианта:

      Если у вас работают обе SIM-карты, оставьте активной в настройках только ту, которую вы планируете использовать. Возможно, телефон не использует правильную SIM-карту при обработке запросов.

    В настройках SIM-карты телефона найдите параметры использования для телефонных звонков. Задайте параметр «Всегда спрашивать». Таким образом, когда вы попытаетесь набрать какой-то запрос, телефон спросит, какую SIM-карту вы хотите использовать. Так у вас будет возможность выбрать правильную SIM-карту для работы.

    Обратите внимание! Если у вас телефон с одной симкой, попробуйте просто извлечь ее и протереть чип. Затем вставьте и посмотрите, восстановит ли это соединение.

    Решение №6: Запуск телефона в безопасном режиме

    Как и в случае с компьютером, смысл безопасного режима Андроид заключается в том, чтобы проверить, хорошо ли работает устройство только со стандартными и необходимыми приложениями для работы системы. Делается это для того, чтобы определить, вызывает ли какое-то недавно установленное приложение ошибку с сообщением «Неполадки подключения MMI». Например, на смартфонах компании Samsung, MMI ошибку часто вызывает программа FX Camera. В таком случае выход из ситуации один – удаление ПО.

    Для запуска безопасного режима проделайте следующее:

    1. Зажмите и удерживайте кнопку «Питание» до тех пор, пока на экране не появится меню выключения.
    2. Вы увидите кнопки «Выключить», «Скриншот», «Перезапустить».
    3. Нажмите и удерживайте кнопку «Выключить» и через несколько секунд появится окошко с сообщением, желаете ли вы перейти в безопасный режим.
    4. Нажмите «Ок» и телефон перезагрузится.
  • Когда система Андроид загрузится, попробуйте отправить с телефона ту команду или запрос, с которым у вас возникла ошибка «Неверный код MMI». Если все будет работать, значит, проблему вызывает какое-то стороннее приложение, которое вы могли недавно устанавливать. Вам необходимо определить его и удалить.
  • Может кому надо! сорри, если было. Инженерные коды для «Андроид»

    Многие пользователи смартфонов и планшетов на Android даже не подозревают о существовании так называемых инженерных или сервисных кодов. Сервисные коды на смартфонах и на обычных телефонах появились намного раньше, чем вышла первая версия ОС Андроид. Они предназначены в основном для инженеров сервисных центров и продвинутых пользователей, поэтом сразу хотим предупредить читателей: если не знаете для чего этот код, то не стоит вводить, а если все же решили ввести код, то делаете на свой страх и риск. Стоит подумать прежде, чем вводить какой-либо код для «Андроид», т.к. это может привести к частичной или полной потери данных и вывести из строя само устройство. Если же Вы приняли решение использовать коды, давайте рассмотрим каждый инженерный код подробнее:

    #06# — Узнать IMEI;

    ##4636## — Сведения и настройки;

    ##8351## — Voice Dialer Logging Enabled;

    ##4636## — Этот код может быть использован для получения интересной информации о телефоне и аккумулятора. Он показывает следующие 4 меню на экране:
    — Информация о телефоне;
    — Информация об аккумуляторах;
    — Статистика аккумулятора;
    — Статистика использования.

    ##7780## — Этот код сбрасывает следующие настройки на заводские:
    — настройки Вашего Google-аккаунта, хранящиеся на Вашем смартфоне;
    — данные и настройки системы и приложений;
    — загруженные приложения.
    Код НЕ удаляет:
    — текущие системные приложения и приложения поставляющиеся со смарфоном;
    — данные на SD карте (фото, видео и т.д.).
    PS: Перед тем, как сбросить настройки смартфон запросит подтверждение, так что до самого последнего момента у Вас будет шанс передумать.

    27673855# — Подумайте прежде, чем вводить этот код. Этот код используется для заводского форматирования, то есть, запускает удаление всех файлов и настроек включая те, которые хранятся во внутренней памяти. Так же он переустанавливает прошивку смартфона.
    PS: После введения кода есть только один путь назад — быстро вытащить батарею и начать восстановление данных через ПК.

    ##34971539## — Этот код используется для получения информации о камере телефона. Он показывает следующие четыре параметра:
    — Обновление прошивки камеры в образ (не пытайтесь повторить этот вариант);
    — Обновление прошивки камеры на SD-карте;
    — Получить версию прошивки камеры;
    — Посмотреть сколько раз обновлялась прошивка.
    ВНИМАНИЕ: Никогда не используйте первый вариант, в противном случае ваша камера телефона перестанет работать, и придется нести телефон в сервисный центр для переустановки прошивки камеры.

    ##7594## — Этот код может быть использован для изменения режима кнопки «Отбой / Вкл.Выкл.». По умолчанию, при длительном нажатии кнопки, будет показан экран с предложением выбрать любой вариант: «Переключиться в беззвучный режим», «Режим полета» или же «Выключить смартфон».
    Вы можете изменить предложенные варианты используя этот код. К примеру, можно сделать так, чтобы телефон сразу же выключался, без выбора из меню нужного варианта.

    ##273283255663 282## — Код открывает экран копирования файлов, на котором можно сделать резервные копии своих данных (фото, аудио и т.п.)

    ##197328640## — Этот код можно использовать для входа в режим обслуживания. Вы можете запускать различные тесты и изменять настройки в сервисном режиме для WLAN, GPS и Bluetooth;

    ##232339## или ##526## или ##528## — WLAN (используйте кнопку «Меню» для запуска различных тестов);

    ##232338## — показывает MAC адрес WiFi;

    ##1575## — Еще один тест GPS;

    ##232337## — Показывает адрес устройства Bluetooth;

    Коды для запуска различных заводских тестов:
    ##0283## — Пакетные Loopback;

    ##0842## — Устройство тест (тест вибрации и подсветки тест);

    ##2663## — Сенсорный экран, версия;

    ##2664## — Сенсорный экран, тест;

    Это основные коды для «Андроид», которые могут понадобится продвинутому пользователю смартфона. Еще раз повторимся: не вводите коды, если не уверены в их предназначении! Но для решения некоторых проблем в работе устройства на «Андроид» эти коды крайне полезны.

    Дубликаты не найдены

    там немного опечатался по невнимательности, пикабу отказывает мне в редактировании!
    Многие пользователи смартфонов и планшетов на Android даже не подозревают о существовании так называемых инженерных или сервисных кодов. Сервисные коды на смартфонах и на обычных телефонах появились намного раньше, чем вышла первая версия ОС Андроид. Они предназначены в основном для инженеров сервисных центров и продвинутых пользователей, поэтом сразу хотим предупредить читателей: если не знаете для чего этот код, то не стоит вводить, а если все же решили ввести код, то делаете на свой страх и риск. Стоит подумать прежде, чем вводить какой-либо код для «Андроид», т.к. это может привести к частичной или полной потери данных и вывести из строя само устройство. Если же Вы приняли решение использовать коды, давайте рассмотрим каждый инженерный код подробнее:

    *#06# — Узнать IMEI;

    *#*#4636#*#* — Сведения и настройки;

    *#*#8351#*#* — Voice Dialer Logging Enabled;

    *#*#4636#*#* — Этот код может быть использован для получения интересной информации о телефоне и аккумулятора. Он показывает следующие 4 меню на экране:
    — Информация о телефоне;
    — Информация об аккумуляторах;
    — Статистика аккумулятора;
    — Статистика использования.

    *#*#7780#*#* — Этот код сбрасывает следующие настройки на заводские:
    — настройки Вашего Google-аккаунта, хранящиеся на Вашем смартфоне;
    — данные и настройки системы и приложений;
    — загруженные приложения.
    Код НЕ удаляет:
    — текущие системные приложения и приложения поставляющиеся со смарфоном;
    — данные на SD карте (фото, видео и т.д.).
    PS: Перед тем, как сбросить настройки смартфон запросит подтверждение, так что до самого последнего момента у Вас будет шанс передумать.

    *2767*3855# — Подумайте прежде, чем вводить этот код. Этот код используется для заводского форматирования, то есть, запускает удаление всех файлов и настроек включая те, которые хранятся во внутренней памяти. Так же он переустанавливает прошивку смартфона.
    PS: После введения кода есть только один путь назад — быстро вытащить батарею и начать восстановление данных через ПК.

    *#*#34971539#*#* — Этот код используется для получения информации о камере телефона. Он показывает следующие четыре параметра:
    — Обновление прошивки камеры в образ (не пытайтесь повторить этот вариант);
    — Обновление прошивки камеры на SD-карте;
    — Получить версию прошивки камеры;
    — Посмотреть сколько раз обновлялась прошивка.
    ВНИМАНИЕ: Никогда не используйте первый вариант, в противном случае ваша камера телефона перестанет работать, и придется нести телефон в сервисный центр для переустановки прошивки камеры.

    *#*#7594#*#* — Этот код может быть использован для изменения режима кнопки «Отбой / Вкл.Выкл.». По умолчанию, при длительном нажатии кнопки, будет показан экран с предложением выбрать любой вариант: «Переключиться в беззвучный режим», «Режим полета» или же «Выключить смартфон».
    Вы можете изменить предложенные варианты используя этот код. К примеру, можно сделать так, чтобы телефон сразу же выключался, без выбора из меню нужного варианта.

    *#*#273283*255*663 282*#*#* — Код открывает экран копирования файлов, на котором можно сделать резервные копии своих данных (фото, аудио и т.п.)

    *#*#197328640#*#* — Этот код можно использовать для входа в режим обслуживания. Вы можете запускать различные тесты и изменять настройки в сервисном режиме для WLAN, GPS и Bluetooth;

    *#*#232339#*#* или *#*#526#*#* или *#*#528#*#* — WLAN (используйте кнопку «Меню» для запуска различных тестов);

    *#*#232338#*#* — показывает MAC адрес WiFi;

    *#*#1575#*#* — Еще один тест GPS;

    *#*#232331#*#* — Bluetooth- тест;

    *#*#232337#*# — Показывает адрес устройства Bluetooth;

    Коды для запуска различных заводских тестов:
    *#*#0283#*#* — Пакетные Loopback;

    *#*#0673#*#* или *#*#0289#*#* — Мелодия-тест;

    *#*#0842#*#* — Устройство тест (тест вибрации и подсветки тест);

    *#*#2663#*#* — Сенсорный экран, версия;

    *#*#2664#*#* — Сенсорный экран, тест;

    *#*#0588#*#* — Датчик движения;

    *#*#3264#*#* — RAM версия.

    Это основные коды для «Андроид», которые могут понадобится продвинутому пользователю смартфона. Еще раз повторимся: не вводите коды, если не уверены в их предназначении! Но для решения некоторых проблем в работе устройства на «Андроид» эти коды крайне полезны.

    Ошибка: Неполадки подключения или неверный код MMI. Что делать?

    Сегодня мы поговорим о достаточно известной ошибке, с которой могут столкнуться пользователи смартфонов на базе операционной системы Andro > Также сообщение может иметь вид «Проблема подключения или неверный код MMI» или даже на английском языке — Connection problem or invalid MMI code.

    Примерно так выглядит ошибка на экране устройства:

    На английском языке:

    Возникает вопрос — что такое MMI? MMI или Man-Machine Interface — это специальный код, который используется для формирования USSD-запросов, который обеспечивает взаимодействие между абонентом и сервисными приложениями оператора. Иногда возникает сбой, что приводит к указанной ошибке. Что же делать? Возможных решений несколько, расскажем о них более подробно.

    Отправьте USSD-запрос еще раз

    Допустим, что вы решили узнать баланс счета, отправив запрос *100#, в результате чего получили ошибку, проблем со связью при этом не наблюдаете. Попробуйте отправить USSD-запрос еще раз, а через некоторое время, если не помогло, снова. Возможно, это проблема на стороне оператора связи.

    Включите и выключите режим полета

    Режим полета, как вы наверняка знаете, позволяет отключать все коммуникации устройства. Включите режим полета буквально на несколько секунд, после чего вновь отключите, чтобы ваш смартфон нашел сеть.

    После этого отправьте USSD-запрос. Скорее всего, все заработает.

    Перезагрузите смартфон

    Вообще, для решения проблем со связью должно хватить включения и отключения режима полета. Однако, возможно, проблема в программном обеспечении смартфона — скажем, произошел некий сбой. Для того, чтобы вернуть устройство в прежний вид, просто перезагрузите его. Или выключите и включите вновь — кому как удобнее.

    После включения проверьте устройство на возникновение ошибки.

    Измените тип сети

    Попробуйте изменить тип сети. Допустим, вы используете 4G-сети (LTE). Вам нужно попробовать изменить тип сети на 3G или даже 2G — на время, потом можете вернуть все в первоначальное состояние.

    Найдите раздел «Мобильные сети» в меню. Здесь нажмите «Режим сети».

    Выберите иной тип подключения.

    После этого отправьте USSD-запрос. Если ошибка исчезла, попробуйте вернуть тип сети, который у вас был установлен.

    Удостоверьтесь, что выбрана сеть оператора

    Это может быть вызвано неким сбоем. Вам нужно выбрать покрытие своего оператора связи. Для этого зайдите все в тот же раздел «Мобильные сети» и выберите пункт «Операторы сети».

    Дождитесь загрузки и выберите сеть своего оператора.

    Процедура может помочь, особенно если вы находитесь в роуминге.

    Загрузка в безопасном режиме

    Есть небольшая вероятность того, что появление ошибки связано с работой какого-либо приложения. Как вы этом удостовериться? Да очень просто — достаточно включить безопасный режим.

    В этом режиме Android запускает только системные приложения, благодаря чему вы сразу сможете понять, в приложении ли дело или нет.

    Как войти в безопасный режим, читайте здесь.

    Попробуйте добавить символ в USSD-запрос

    Некоторыми пользователями утверждается, что может помочь добавление символа в USSD-запрос. Например, запятой.

    USSD-запрос работает, как ни странно.

    Проблемы с сим-картой

    Возникает ошибка и в том случае, если есть проблемы с сим-картой. Например, она очень старая и ее пора заменить, либо же вы неверно ее обрезали. В таких случаях USSD-запросы вообще не будут работать, вам нужно заменить сим-карту.

    Друзья! Если наш сайт помог вам или просто понравился, вы можете помочь нам развиваться и двигаться дальше. Для этого можно:

    • Оставить комментарий к статье.

    Что такое код шеринг?

    Глядя на информационное табло в аэропорту, вы иногда замечали, что в одно и то же время по тому же маршруту летят еще несколько авиакомпаний. Это не значит, что одновременно в небо поднимутся несколько самолетов и полетят в одном направлении.

    Код шеринг (анг. code-share) – это договор между авиакомпаниями о совместном эксплуатации рейсов на одном маршруте. Каждая авиакомпания, заключившая соглашение, продает рейс, который фактически выполняется одной из них, по своим ценам и под своим кодом и номером рейса. Поэтому мы и видим на табло несколько авиакомпаний и номеров.

    Например, рейс Москва-Минск выполняется сразу тремя авиакомпаниями: “Белавиа”, “Сибирь” (S7 Airlines) и “Трансаэро” и, соответственно, получает три разных номера:

    Хотя фактически вы летите на самолете авиакомпании “Белавиа”.

    Благодаря код-шеру, авиакомпании расширяют свою географию полетов или увеличивают частоту полетов, не вводя собственных рейсов. Для авиакомпаний это большая экономия, формально частота полетов сохраняется, но, фактически, в небо поднимается рейс другой авиакомпании.

    Какие преимущества код-шера для пассажиров?

    Существует целый ряд преимуществ “код-шера” и для пассажира. Например, если вы являетесь участником бонусной программы одной из авиакомпаний. Кодшеринговое соглашение в этом случае – это возможность выбрать более удобный рейс, не “изменяя” своей авиакомпании. Вы продолжаете накапливать баллы или мили. Это является преимуществом кодшеринга над интерлайном, где пассажиры не имеют возможности участвовать в бонусной программе авиакомпании в которой покупали билет (если она не является компанией-перевозчиком).

    Код-шер позволяет бронировать авиабилеты на рейсы с более удобными стыковками. Возьмем, например, рейс в Лондон: благодаря тому, что один из рейсов авиакомпании “Трансаэро” (совместно с авиакомпанией bmi) выполняется утром, пассажиры bmi могут пересесть на более удобный стыковочный рейс bmi в Европу или США, которые вылетают в середине дня.

    Во время полета, в независимости от того, в какой авиакомпании вы покупали билет, за вас несет ответственность авиакомпания-перевозчик. И если в полете вам нагрубили, испортили багаж, отменили рейс и т.д., то все претензии вы должны предъявлять только к авиакомпании-перевозчику.

    Что такое код безопасности и почему я вижу, что он изменился?

    Что такое код безопасности?

    У каждого разговора Signal есть уникальный код безопасности, который позволяет проверить защищенность сообщений и звонков с определенными контактами.

    Проверка кода безопасности — это надежный способ защиты конфиденциальных коммуникаций. Если код безопасности помечен как проверенный, его изменение необходимо одобрить вручную перед отправкой нового сообщения.

    Почему я вижу предупреждение об изменении кода безопасности?

    Signal уведомляет вас об изменении кода безопасности. Это позволяет вам проверять конфиденциальность своих коммуникаций с контактом и защититься от атак «человек посредине».

    Обычно уведомление о коде безопасности отображается, когда контакт переходит на новый телефон или повторно устанавливает Signal. Но если код безопасности меняется часто или неожиданно, это может быть подозрительно.

    Как мне увидеть код безопасности?

    1. Откройте разговор с контактом.
    2. Нажмите на заголовок разговора или перейдите в настройки разговора.
    3. Выберите «Посмотреть код безопасности».

    Как мне проверить код безопасности с моим контактом?

    Самый простой способ сравнить коды безопасности — отсканировать QR-код вашего контакта на экране просмотра кода безопасности. Вы также можете просмотреть или прослушать цифровой код или скопировать его в буфер, нажав на значок «Поделиться». Если код безопасности совпадает, вы можете быть уверены, что общаетесь с тем человеком.

    Как управлять статусом проверки кода безопасности?

    Просмотрите код безопасности и нажмите на переключатель или кнопку, чтобы изменить статус проверки.

    • В Android нажмите на переключатель «Проверено». Когда контакт будет проверен, переключатель сдвинется вправо и станет синим.
    • В iOS нажмите на кнопку «Отметить как проверенный» или выберите «Сбросить проверку».
    • На компьютере нажмите «Отметить как проверенный» или «Отметить как непроверенный».

    Как узнать, что код безопасности отмечен как проверенный?

    Если код безопасности проверен, в заголовке разговора появится галочка рядом с именем контакта. Код будет считаться проверенным, пока не изменится или вы не измените статус проверки вручную.

    Справочник MCC кодов и бонусных программ банков

    MCC – это четырёхзначный код, определяющий категории продавца при операциях с банковской картой. По нему банки определяют категорию покупки и процент кэшбэка. На этом сайте вы можете получить информацию об MCC кодах, найти МСС код нужной торговой точки и подобрать выгодную карту для оплаты. Получив информацию, поддержите проект и добавьте коды своих последних операций на сайт.

    Поиск торговых точек

    Поиск MCC

    Популярные карты с кэшбэком

    Кэшбэк до 5% Дебетовая Выводится MCC

    Кэшбэк до 3% Дебетовая Выводится MCC

    Кэшбэк до 6% Дебетовая Кредитная Выводится MCC

    Кэшбэк до 10% Кредитная

    Кэшбэк до 3% Дебетовая Кредитная Мили

    Кэшбэк до 10% Кредитная

    Что такое MCC код?

    MCC код (англ. Merchant Category Code — «код категории продавца») — четырёхзначный номер, классифицирующий вид деятельности торгово-сервисной точки при операции оплаты по банковским картам. Компании присваивается код MCC, когда та начинает принимать к оплате карты. Как правило, код назначается автоматически банком, предоставляющим услугу эквайринга (приём к оплате банковских карт в качестве средства оплаты товаров или услуг), при установке и настройке POS-терминала на основе анкеты о характере торгово-сервисной деятельности. В случае, когда точка имеет несколько направлений деятельности, MCC присваивается по основному направлению. Также возможна ситуация, когда в одной точке могут быть терминалы разных банков с разными MCC.

    По MCC коду торговой точки банки определяют категорию и характер операции. От MCC кода может зависеть процент кэшбэка, если вы пользуетесь картой с программой cashback. Еще по МСС коду определяется характер операции – покупка, перевод или снятие наличных. Поэтому от него зависит сохранение льготного периода по кредитной карте и взимание комиссии за снятие денег. Следует обратить внимание на то, что банк, который выпустил вашу карту, не может влиять на выбор категории и не несёт ответственности, если продавец имеет неверный МСС код или не тот, который вы ожидали увидеть.

    Илон Маск рекомендует:  email рассылка по шаблону на PHP
    Понравилась статья? Поделиться с друзьями:
    Кодинг, CSS и SQL