<< Назад к оглавлению
В прошлом уроке мы собирали прошивку для контроллера, чтобы он работал через USB. Но для взаимодействия с компьютером нам нужна еще и специальная программа, которая будет запускаться на компьютере.
Вот сейчас мы и будем ее создавать.
Опять же в пакете Microchip solutions есть пример, для нашего контроллера, но я переписал его по своему. Во-первых я сделал без использования графического интерфейса, и размер кода уменьшился раза в 3-4. Что намного лучше для изучения. Тем не менее, принцип работы один. код в стандартном примере от microchip работает так же как этот.
Программа написана в C++. Проект собран в бесплатной студенческой версии Visual C++ express 2010. Я буду давать общие идеи и комментарии по коду, но подразумеваю, что вы уже имеете хоть какой-то опыт программирования в C++.
Итак, начинаем
Здесь находится весь проект, включая исходный текст ссылка
Для того, чтобы читать и записывать данные через USB порт нам нужно получить указатель на наше устройство. Поскольку в отличие от старых портов, подключено может быть устройств свыше сотни, то получить этот указатель не так-то просто. Для того, чтобы это сделать мы будем обращаться к драйверам windows, а именно SetupAPI. Кстати, как только мы получим указатель, то будем общаться с USB портом, будто бы это файл.
Передача данных будет занимать лишь пару команд. Но вот подготовка!
Поскольку мы программируем в С++ то нам нужно быть очень аккуратными с типами данных.
Создаем консольный проект win32. И добавляем туда единственный файл main.cpp
Итак, нам необходимо подключить некоторые библиотеки.
#include <iostream>
#include <Windows.h>
#include <setupapi.h>
Так же подключаем внешнюю библиотеку:
#pragma comment (lib, "Setupapi.lib")
Первая описанная функция в программе - это getUSBHandle(). Ее описание - в комментариях кода. Да и вообще основные комментарии приведены в коде. Она служит для того, чтобы найти наше устройство и подготовить указатели, чтобы мы могли записывать в устройство и читать из него.
Если в двух словах, то она использует стандартные windows функции для доступа к драйверам USB и через них получает указатель на само устройство.
Если интересно, что все эти функции делают и как, то обращайтесь к MSDN или к книге Агурова, что лежит в оглавлении. Что важно знать: у каждого устройства есть путь, и нам важно получить его. Мы сначала проверяем, совпадает ли ID с устройством, что мы ищем. А потом находим путь устройства.Мы ищем только среди устройств HID класса. это определяется в переменной Guid. Остальное см в комментариях программы
Следующая функция - writeReadUSB. Это просто вспомогательная функция, которая записывает в наше устройство. Обращаю внимание, что запись и чтение устройства после того, как мы создали указатель на него реализуется с помощью стандартных комманд WriteFile и ReadFile
И после этого уже мы видим функцию main с которой и начинается выполнение программы. Она вызывает getUSBHandle, пока мы не получим указатель на устройство, потом читает с клавиатуры комманду и в зависимости от нее, передает и читает данные с USB устройства.
В проекте по ссылке выше лежит исходный код с комментариями и сама скомпилированная программа. Удачи.
В процессе поиска ошибки я наткнулся на библиотеку hidapi. Она является кроссплатформенной. И Только для работы с hid устройствами. Очень проста в использовании. Привожу проект под нее. ссылка.
Hidapi скачан с официального сайта. Для того чтобы начать проект нужно добавить setupapi.lib в линковщик. project->properties->linker->input и подписать туда setupapi.lib;
Удачи.
Нашел пристойное описание библиотеки здесь: http://microsin.net/programming/PC/multi-platform-hid-api.html.
Спасибо!
Здесь находится весь проект, включая исходный текст ссылка
Для того, чтобы читать и записывать данные через USB порт нам нужно получить указатель на наше устройство. Поскольку в отличие от старых портов, подключено может быть устройств свыше сотни, то получить этот указатель не так-то просто. Для того, чтобы это сделать мы будем обращаться к драйверам windows, а именно SetupAPI. Кстати, как только мы получим указатель, то будем общаться с USB портом, будто бы это файл.
Передача данных будет занимать лишь пару команд. Но вот подготовка!
Поскольку мы программируем в С++ то нам нужно быть очень аккуратными с типами данных.
Создаем консольный проект win32. И добавляем туда единственный файл main.cpp
Итак, нам необходимо подключить некоторые библиотеки.
#include <iostream>
#include <Windows.h>
#include <setupapi.h>
Так же подключаем внешнюю библиотеку:
#pragma comment (lib, "Setupapi.lib")
Первая описанная функция в программе - это getUSBHandle(). Ее описание - в комментариях кода. Да и вообще основные комментарии приведены в коде. Она служит для того, чтобы найти наше устройство и подготовить указатели, чтобы мы могли записывать в устройство и читать из него.
Если в двух словах, то она использует стандартные windows функции для доступа к драйверам USB и через них получает указатель на само устройство.
Если интересно, что все эти функции делают и как, то обращайтесь к MSDN или к книге Агурова, что лежит в оглавлении. Что важно знать: у каждого устройства есть путь, и нам важно получить его. Мы сначала проверяем, совпадает ли ID с устройством, что мы ищем. А потом находим путь устройства.Мы ищем только среди устройств HID класса. это определяется в переменной Guid. Остальное см в комментариях программы
Следующая функция - writeReadUSB. Это просто вспомогательная функция, которая записывает в наше устройство. Обращаю внимание, что запись и чтение устройства после того, как мы создали указатель на него реализуется с помощью стандартных комманд WriteFile и ReadFile
И после этого уже мы видим функцию main с которой и начинается выполнение программы. Она вызывает getUSBHandle, пока мы не получим указатель на устройство, потом читает с клавиатуры комманду и в зависимости от нее, передает и читает данные с USB устройства.
В проекте по ссылке выше лежит исходный код с комментариями и сама скомпилированная программа. Удачи.
В процессе поиска ошибки я наткнулся на библиотеку hidapi. Она является кроссплатформенной. И Только для работы с hid устройствами. Очень проста в использовании. Привожу проект под нее. ссылка.
Hidapi скачан с официального сайта. Для того чтобы начать проект нужно добавить setupapi.lib в линковщик. project->properties->linker->input и подписать туда setupapi.lib;
Удачи.
Нашел пристойное описание библиотеки здесь: http://microsin.net/programming/PC/multi-platform-hid-api.html.
Спасибо!
Что то совсем перестали писать
ОтветитьУдалитьНу у меня изначально цель была описать вплоть до USB интерфейса. Если кто-то это читает, то я думал, проверить на ошибки все вышенаписанное. Сейчас занимаюсь CAN интерфейсом. Буду использовать в аспирантуре. На очень близких контроллерах.
ОтветитьУдалитьЕсли Вас интересует что-то конкретное, то с радостью опишу.
Александр
Спасибо!
ОтветитьУдалитьПытался разобраться, пользуясь другими источниками - не очень получалось.
Обнаружил Вашу статью. Все прочитал - все получилось.
Помогло в аппаратной части и программировании контроллера.
Осталось написать программу для PC. Пытаюсь адаптировать все для C#
Очень рад, что помог вам. Если вы хотите C#, то по-моему в пакете microchip solutions есть как раз версия для этого языка. Насколько я помню, занимался наоборот, тем, что под С++ переписывал. Я его лучше знаю
ОтветитьУдалитьТолько что проверил, у меня установлен пакет библиотек microchip solutions 2013-06-15 и там в каталоге /USB/Device - HID - Custom demos /pnp demo - windows software. Там есть графический пример на VCsharp. Вроде бы он должен работать с этой же прошивкой контроллера, но я не могу сейчас проверить. Занимаюсь другими процессорами.
ОтветитьУдалитьТам на самом-то деле в основном идет использование функций winsetupapi. Это сторонние функции, поставляемые с windows. Примерно все то же самое должно быть.
ОтветитьУдалитьСпасибо! Как раз скачал microchip solutions 2013-06-15. Но для того, чтобы пользоваться, пришлось еще и Visual Studio 2013 скачать. Как-то до этого в своих задачах обходился стареньким 2005-м. Вот только добрался до примеров.
ОтветитьУдалитьА нет! Этот пример, который Вы указали, даже для 2005 подходит! Надо же, как я раньше не нашел его? Спасибо еще раз!
ОтветитьУдалитьЗдравствуйте! Спасибо за статьи, они очень помогли. Можете проверить ссылку к этой статье, а то при переходе по ней яндекс выдает сообщения - " Ничего не найдено. Возможно, владелец удалил файлы или закрыл к ним доступ. А может быть, вам досталась ссылка с опечаткой."
ОтветитьУдалитьнет, все верно. Может яндекс тупил. Сейчас перезалью еще на 1 сервер
ОтветитьУдалитьЕще раз спасибо! Ссылка сработала.
ОтветитьУдалитьЗдравствуйте!Создал консольное приложение ,скопировал файл main.cpp скачанный по ссылке.Компиляция успешно проходит,екзешник запускаю ,а там по кругу,но светодиод не зажигается.Хотя из исходников в графическом режиме ,когда жмакаеш по кнопке ,светодиод зажигается и гаснет,в чем проблема может быть?
ОтветитьУдалитьАга. Словил тот же глюк. Попробую в ближайшее время подправить. Я на старом компе делал. Думаю, что код и компиляторы нетолеранты к железу. Вы на studio 2010 собираете?
ОтветитьУдалитьДа она самая.А вообще какой код написать для проверки ,ушло на микропроц или нет,типа If(WriteFile(WriteHandle, &OUTBuffer, 65, &BytesWritten, 0))................?,функция при передаче каким болом отвечает TRUE или FALSE?
УдалитьИзвините, что долго. Нашел ошибку.В DetailedInterfaceDataStructure в конце был неправильный размер структуры. Сначала он определялся, а потом выделялась память. И размер сбивался. Нужно было бы его назначить заново, Сейчас залью рабочий пример. Правда я переставился на Visual studio 2012 express. Но я думаю, что и на 2010 будет работать. Отпишитесь, как проверит, пожалуйста.
ОтветитьУдалитьАга. Таким. образом и проверять. Там есть функция запись-чтение. Там так и сделано
Ага. Подправил. Проверьте пожалуйста. Ума не приложу, почему раньше работало.
ОтветитьУдалитьна studio 2010 OK!
УдалитьПодскажите, пожалуйста хорошую литературу для создания приложений С++ для МК. Или просто по С++
ОтветитьУдалитьПо C++ посоветую Шилдта. С GUI посложнее. Советую не морочить себе голову ни winAPI ни MFC, а сразу писать на QT. Найдите какие-нибудь онлайн уроки. Я честно говоря не помню уже, на каком ресурсе учил ее
ОтветитьУдалитьЭтот комментарий был удален администратором блога.
ОтветитьУдалитьМарна Красивая услышана. Все подправлю, дорогая)
ОтветитьУдалитьМарна Красивая услышана. Все подправлю, дорогая)
ОтветитьУдалитьhttp://yadi.sk/d/CBgnem7JA4aMB
ОтветитьУдалитьСсылка не работает.
возьмите вот эту https://yadi.sk/d/jkSPtG9lhTwhf в конце статьи.
Удалитьвозьмите вот эту https://yadi.sk/d/jkSPtG9lhTwhf в конце статьи.
ОтветитьУдалитьспасибо.
ОтветитьУдалить