§ 27. WoodmanUSB. Программирование на С#
|
Дмитрий Иванов, 09 Декабря 2013
|
|
Файлы к статье скачать
|
Имя: KA027.zip (ZIP архив) |
Размер: 72 КБ |
|
Рассмотрим как можно написать программу для простого USB устройства с использованием модуля WoodmanUSB на языке С#. Я буду использовать среду разработки Microsoft Visual Studio 2005 (можно и 2003). Итак, запускаем среду. Выбираем File -> New -> Project...

Перед нами появится вот такое окно с выбором возможных проектов. В списки Project types отыскиваем язык C# и тип приложения "Windows". В графическом списке Templates выбираем Windows Application. С помощью кнопки Browse.. указываем путь, по которому разместятся файлы проекта. В окошке ввода Name указываем имя нашего приложения, например TestWUSB. Нажимаем Ok.

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

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

Итак, на данный момент у yас есть пустая заготовка формы. Добавим на нее необходимые элементы управления, чтобы функциолнальность нашего приложения не отличалась от рассмотренных ранее. Делается это довольно просто: с панели Toolbox перетаскиваем необходимые элементы управления на форму. Начиная с 2003 студии Microsoft поменяла способ и внешний вид интерфейса для задания свойст элемента управления. Для этого теперь существует отельная панель управления Propertis. Ее можно вызвать, нажав правой кнопкой на нужный элемент управления и выбрав пункт Propertis..
Итак, переместив необходимые элементы на форму, задав им необходимые заголовки и правильно их разместив, Вы должны получить нечто вроде такого:

Закончив с внешним оформлением, перейдем к программированию. Сначала, давайте займемся экспортом функций из библиотеки WUSBdrv.dll в наше приложение. В С# для этого все предусмотрено, хотя и выглядит немного странновато. В первую очередь, подключаем пространство имен System.Runtime.InteropServices, в котором определены типы и атрибуты для управления процессоми передачи данных от типов .NET к типам COM (не COM порт, а Component Object Model(ActiveX)). Нас от туда будет интересовать в первую очередь служба активизации платформ (Platform Invocation Services, PInvoke). Именно она обеспечивает взаимосвязь NET и внешней Dll, которой будет WUSBdrv.dll.
Далее, с помощью атрибута [DllImport()] объявляем необходимые функции из библиотеки. Незабываем ставить ключевые слова static и extern а также использовать типы данных .NET (например, Int32 вместо int). В итоге должно быть примерно вот так:
.......
using System.Windows.Forms;
using System.Runtime.InteropServices; //для получения доступа к типам PInvoke
namespace TestWUSB
{
public partial class Form1 : Form
{
//********** экспортируем функции из внешнеей Dll *********
[DllImport("WUSBdrv")]
public static extern Int32 WUSB_Open();
[DllImport("WUSBdrv")]
public static extern Int32 WUSB_SetupPortA(Byte iomsk);
[DllImport("WUSBdrv")]
public static extern Int32 WUSB_WritePortA(Byte value);
[DllImport("WUSBdrv")]
public static extern Int32 WUSB_ReadPortA(ref Byte data);
//*********************************************************
public Form1()
{
InitializeComponent();
}
.....
Разумеется, библиотеку WUSBdrv.dll нужно поместить в одну папку с исполняемой программой. Теперь давайте займемся обработчиками на нажатие кнопок. Начнем с открытия устройства. Код вполне очевиден, и дополнительных комментариев не требует.
private void button1_Click(object sender, EventArgs e)
{
Int32 status = WUSB_Open();
if (status == 0)
{
MessageBox.Show("ERROR! Can`t open WodmanUSB device", "Info",
MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
else
{
MessageBox.Show("Open OK", "Info",
MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}
Код установки маски ввода-вывода:
private void button2_Click(object sender, EventArgs e)
{
string s;
s = textBox1.Text;
Byte mask = Byte.Parse(s);
Int32 status = WUSB_SetupPortA(mask);
if (status == 0)
{
MessageBox.Show("ERROR! Can`t set Mask", "Info",
MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
else
{
MessageBox.Show("IOMask was sucsesfully set", "Info",
MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}
Обработчик записи данных:
private void button3_Click(object sender, EventArgs e)
{
string s;
s = textBox2.Text;
Byte data = Byte.Parse(s);
Int32 status = WUSB_WritePortA(data);
if (status == 0)
{
MessageBox.Show("Write Error!", "Info",
MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
}
И наконец, обработчик чтения данных:
private void button4_Click(object sender, EventArgs e)
{
Byte data = 0;
Int32 status = WUSB_ReadPortA(ref data);
if (status == 0)
{
MessageBox.Show("Read Error!", "Info",
MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
string s;
s = data.ToString();
textBox3.Text = s;
}
На этом все. Можно компилировать и запускать. Должно все работать.
© Дмитрий Иванов
09 Декабря 2013 года
http://www.kernelchip.ru