пятница, 27 сентября 2013 г.

Урок 6. USB. Сторона компьютера

<< Назад к оглавлению

В прошлом уроке мы собирали прошивку для контроллера, чтобы он работал через 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.
Спасибо!

26 комментариев:

  1. Что то совсем перестали писать

    ОтветитьУдалить
  2. Ну у меня изначально цель была описать вплоть до USB интерфейса. Если кто-то это читает, то я думал, проверить на ошибки все вышенаписанное. Сейчас занимаюсь CAN интерфейсом. Буду использовать в аспирантуре. На очень близких контроллерах.
    Если Вас интересует что-то конкретное, то с радостью опишу.
    Александр

    ОтветитьУдалить
  3. Спасибо!
    Пытался разобраться, пользуясь другими источниками - не очень получалось.
    Обнаружил Вашу статью. Все прочитал - все получилось.
    Помогло в аппаратной части и программировании контроллера.
    Осталось написать программу для PC. Пытаюсь адаптировать все для C#

    ОтветитьУдалить
  4. Очень рад, что помог вам. Если вы хотите C#, то по-моему в пакете microchip solutions есть как раз версия для этого языка. Насколько я помню, занимался наоборот, тем, что под С++ переписывал. Я его лучше знаю

    ОтветитьУдалить
  5. Только что проверил, у меня установлен пакет библиотек microchip solutions 2013-06-15 и там в каталоге /USB/Device - HID - Custom demos /pnp demo - windows software. Там есть графический пример на VCsharp. Вроде бы он должен работать с этой же прошивкой контроллера, но я не могу сейчас проверить. Занимаюсь другими процессорами.

    ОтветитьУдалить
  6. Там на самом-то деле в основном идет использование функций winsetupapi. Это сторонние функции, поставляемые с windows. Примерно все то же самое должно быть.

    ОтветитьУдалить
  7. Спасибо! Как раз скачал microchip solutions 2013-06-15. Но для того, чтобы пользоваться, пришлось еще и Visual Studio 2013 скачать. Как-то до этого в своих задачах обходился стареньким 2005-м. Вот только добрался до примеров.

    ОтветитьУдалить
  8. А нет! Этот пример, который Вы указали, даже для 2005 подходит! Надо же, как я раньше не нашел его? Спасибо еще раз!

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

    ОтветитьУдалить
  10. нет, все верно. Может яндекс тупил. Сейчас перезалью еще на 1 сервер

    ОтветитьУдалить
  11. Еще раз спасибо! Ссылка сработала.

    ОтветитьУдалить
  12. Здравствуйте!Создал консольное приложение ,скопировал файл main.cpp скачанный по ссылке.Компиляция успешно проходит,екзешник запускаю ,а там по кругу,но светодиод не зажигается.Хотя из исходников в графическом режиме ,когда жмакаеш по кнопке ,светодиод зажигается и гаснет,в чем проблема может быть?

    ОтветитьУдалить
  13. Ага. Словил тот же глюк. Попробую в ближайшее время подправить. Я на старом компе делал. Думаю, что код и компиляторы нетолеранты к железу. Вы на studio 2010 собираете?

    ОтветитьУдалить
    Ответы
    1. Да она самая.А вообще какой код написать для проверки ,ушло на микропроц или нет,типа If(WriteFile(WriteHandle, &OUTBuffer, 65, &BytesWritten, 0))................?,функция при передаче каким болом отвечает TRUE или FALSE?

      Удалить
  14. Извините, что долго. Нашел ошибку.В DetailedInterfaceDataStructure в конце был неправильный размер структуры. Сначала он определялся, а потом выделялась память. И размер сбивался. Нужно было бы его назначить заново, Сейчас залью рабочий пример. Правда я переставился на Visual studio 2012 express. Но я думаю, что и на 2010 будет работать. Отпишитесь, как проверит, пожалуйста.
    Ага. Таким. образом и проверять. Там есть функция запись-чтение. Там так и сделано

    ОтветитьУдалить
  15. Ага. Подправил. Проверьте пожалуйста. Ума не приложу, почему раньше работало.

    ОтветитьУдалить
  16. Подскажите, пожалуйста хорошую литературу для создания приложений С++ для МК. Или просто по С++

    ОтветитьУдалить
  17. По C++ посоветую Шилдта. С GUI посложнее. Советую не морочить себе голову ни winAPI ни MFC, а сразу писать на QT. Найдите какие-нибудь онлайн уроки. Я честно говоря не помню уже, на каком ресурсе учил ее

    ОтветитьУдалить
  18. Этот комментарий был удален администратором блога.

    ОтветитьУдалить
  19. Марна Красивая услышана. Все подправлю, дорогая)

    ОтветитьУдалить
  20. Марна Красивая услышана. Все подправлю, дорогая)

    ОтветитьУдалить
  21. http://yadi.sk/d/CBgnem7JA4aMB
    Ссылка не работает.

    ОтветитьУдалить
    Ответы
    1. возьмите вот эту https://yadi.sk/d/jkSPtG9lhTwhf в конце статьи.

      Удалить
  22. возьмите вот эту https://yadi.sk/d/jkSPtG9lhTwhf в конце статьи.

    ОтветитьУдалить