СОПРЯЖЕНИЕ КОМПЬЮТЕРОВ С ВНЕШНИМИ УСТРОЙСТВАМИ

Яндекс цитирования

Друзья ресурса:

www.roboforum.ru




Дополнение 3-ей части: пишем программу на C#

файлы к статье (размер: 33.9 КБ)

Последнее время Microsoft очень активно продвигает свое творение как платформу .NET и один из языков этой концепции C#. Можно долго спорить о достоинствах и недостатках .NET. Я здесь этого делать не буду, хотя имею свое собственное вполне обоснованное негативное отношение к этой с ситеме, вызванное, пожалуй, в первую очередь тем, что задачи котррые мне приходится решать (работа с железом, низкоуровневое программирование и т.д.) не могут быть полноценно реализованы с помощью технологий .NET. Чего только стоит отказ разработчиков это системы от допуска программистов к использованию полноценных указателей, адресов и динамического выделения памяти!

У всех свои вкусы и пристрастия в области прграммирования, многие отдают предпочтение C#. Поэтому давайте рассмотрим как можно написать программу для простого USB устройства с использованием модуля WoodmanUSB на языке С#. Я буду использовать среду разработки Microsoft Visual Studio 2005 (можно и 2003). Итак, запускаем среду. Выбираем File -> New -> Project...

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


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


Если дважды щелкнуть на форме, то мы попадем собственно к коду, который обслуживает эту форму. Небольшое отступление: уважаемые Java-программитсы! Не находите сходства между конструкцией приложения C# и языком Java?

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

программирование 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 нужно поместить в одну папку с исполняемой программой. Теперь давайте займемся обработчиками на нажатие кнопок. Начнем с открытия устройства. Код вполне очевиден, и дополнительных комментариев не требует, только если удивиться, что они сделали с MessageBox`ом - места живого не осталось, все перекромсали.

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;
}


На этом все. Можно компилировать и запускать. Должно все работать. Не забудьте только модуль к компьютеру подключить.


© Иванов Д. В.
28 октября 2007 года
www.pcports.ru




Контакты | Гостевая книга

© 2005-2010 сопряжение компьютеров с внешними устройствами PCPORTS.RU © Иванов Д.В.