Интернет-магазин

Просмотр корзины
В корзине:

товаров - 0 шт.



§ 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..

программирование USB WoodmanUSB

программирование USB на С#

Итак, переместив необходимые элементы на форму, задав им необходимые заголовки и правильно их разместив, Вы должны получить нечто вроде такого:

программирование USB на C#

Закончив с внешним оформлением, перейдем к программированию. Сначала, давайте займемся экспортом функций из библиотеки 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



© KERNELCHIP 2006 - 2017