Найти в Дзене
IT. Как это работает?

RS232. Прием данных компьютером

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

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

Структура операционной системы

Первым делом необходимо осознать насколько мы далеки от железа если пользуемся современными популярными операционными системами. В одном из прошлых обзоров вся глубина этого вопроса была хоть немного освещена.

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

Прикладной интерфейс приложений (API)

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

Практически сразу не только сторонние программисты, но и сама корпорация Microsoft начала разработку еще нескольких вариантов библиотек, чтобы скрыть от прикладных программистов подробности работы с API функциями. Они располагаются слоем выше Win32API и являются еще одной прокладкой между приложением и железом (рисунок выше). Сейчас мы не станем подыскивать одну из таких прокладок, касающейся нашей сегодняшней задачи, а решим задачу без подготовки.

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

Функция создания/открытия файла возвращает дескриптор
Функция создания/открытия файла возвращает дескриптор

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

Конкретно по интерфейсу RS232

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

Согласно документации, функция открытия файла требует имя, параметры доступа (чтение или запись) и еще много чего, но главное это имя. При успешном открытии мы получим дескриптор. А вот с ним уже все двери открыты. Интерфейс RS232 является очень специфическим устройством и довольно непохожим на файл. У файла на диске нет таких параметров как скорость передачи данных и бит четности. Для настройки параметров интерфейса применяется структура данных (DCB), которая передается в ядро.

Описание структуры DCB и функций работы с файлом
Описание структуры DCB и функций работы с файлом

В этой структуре довольно много непонятного, но чтобы не нагревать себе голову, давайте передадим только то, в чем точно уверены. Мы изменим битовую скорость (BaudRate), размер слова данных (ByteSize), наличие бита четности (Parity) и количество стоп бит (StopBits). Остальное менять не будем.

Достанем текущее состояние структуры из ядра при помощи функции GetCommState(). Она требует дескриптор, который у нас уже есть и указатель на то место куда структуру выгрузить. После изменения полей структуры отправим ее в ядро при помощи функции SetCommState(). Чтение файла происходит при помощи функции ReadFile(). Она требует дескриптор, адрес буфера куда класть данные, количество байт, которые нужно прочитать, указатель на место куда будет записано сколько байт было прочитано. Вот уж такой замороченный прикладной интерфейс.

После прочтения данных закроем устройство, вызвав функцию CloseHandle(). Параметром ее является дескриптор файла, связанного с устройством.

Приступаем к написанию кода

Функции прикладного интерфейса можно подключить через заголовочный файл windows.h. Для вывода информации подключим другой заголовочный файл. Точка входа в программу это функция main(). В ней забронируем место под дескриптор, под буфер данных, под количество полученных байт. Присвоим последнему байту буфера нулевое значение.

Открываем файл с именем COM3. Указываем все необходимые параметры. Доступ только на чтение. Резервируем место под структуру. Достаем из ядра текущее состояние интерфейса. Выведем на экран несколько его параметров.

Теперь меняем параметры. Скорость передачи бит задаем константой 9600 бит в секунду. Количество информационных бит во фрейме 8. Убираем бит четности. Стоп бит один. Отправляем структуру в ядро.

Читаем данные в буфер из интерфейса в количестве 99 байт, выводим содержимое буфера на экран как строку и закрываем устройство.

Компилируем исходный код и запускаем. В буфере находится 99 заглавных букв Z. Это ровно то, что мы выставляли на передачу в программируемой логической интегральной схеме. Думаете на этом все закончено? Вовсе нет, теперь нужно наладить передачу данных от компьютера на устройство.

Видео-обзор с канала YouTube

Исходный код

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