| СОПРЯЖЕНИЕ КОМПЬЮТЕРОВ С ВНЕШНИМИ УСТРОЙСТВАМИ |
|
Дополнение 3-ей части: пишем программу на C#
Последнее время 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 - Вам это должно быть очень хорошо знакомо.
Итак, перетаскав необходимые элементы на форму, задав им необходимые заголовки и правильно их разместив, Вы должны получить нечто вроде такого:
Закончив с внешним оформлением, перейдем к программированию. Сначала, давайте займемся экспортом функций из библиотеки 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;
}
На этом все. Можно компилировать и запускать. Должно все работать. Не забудьте только модуль к компьютеру подключить. © Иванов Д. В. |
| Контакты | | | Гостевая книга |
| © 2005-2010 сопряжение компьютеров с внешними устройствами PCPORTS.RU © Иванов Д.В. | ||||||||||||||