Tải bản đầy đủ (.pdf) (11 trang)

TÀI LIỆU HƯỚNG DẪN-VIẾT CHƯƠNG TRÌNH C# GIAO TIẾP VỚI THIẾT BỊ USB

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (579.71 KB, 11 trang )

Nguyn Ngc Hng Lp TKTL 40 HVKTQS
- 1 -
Phn 3:
Vit Chng Trình C# giao tip vi thit b USB
1. To Driver cho thit b và to các th vin hàm giao tip USB:
Công vic u tiên mà bn phi làm vi WinDriver  to Driver và các
th vin phn mm cho chng trình PC ca bn. Các bc tin hành bao gm:
1. n thit b ca bn vào cng USB trên máy tính computer:
2. Chy DriverWizard và chn thit b ca bn:
hình 1: M hoc to mt WinDriver Project
Chn thit b ca bn trong list ca WinDriver:
Nguyn Ngc Hng Lp TKTL 40 HVKTQS
- 2 -
Chn phát ra file Driver và ánh tên cho thit b ca bn:
Tip tc chn next ta c:
i ây bn có th kim tra vic truyn nhn qua USB xem thit b ca bn ã
hot ng cha. Vic tip theo là to ra giao din ban u và th vin trên C#.
Click và biu tng Generate Code và chn ngôn ng mà bn s dng, hin nay
ngôn ng C# thông dng vi nhiu ngi và có nhiu tin ích hn so vi VB
nên ây tôi chn nh sau:
Công vic còn li ch là OK và ch máy chy hihi.
Nguyn Ngc Hng Lp TKTL 40 HVKTQS
- 3 -
Chy Project trên Visual Studio 2005 bn có th thy WinDriver ã to cho ta
t giao din ban u  s dng các giao tip USB, bn có th s dng luôn
giao din này  thc hin theo Project ca bn:
Chú ý rng bn phi Project/ Set as Startup Project trc ã.
Nhng  giúp cho ngi mi hc có th hiu c mt cách nhanh chóng tôi
xin t to mt giao din khác n gin ngn gn hn bng vic s dng các th
vin mà WinDriver va to ra cho chúng ta. ó là hai th vin
project_usb_4550_lib.dll (th vin này do ta t nó cùng vi tên Project khi to


ra) và wdapi_dotnet921.dll hai th viên này cha các lp và các y quyn rt
u ích giúp cho vic qun lý và thc hiên giao tip bng USB.
Công vic tip theo ca chúng ta là hãy tam quên i cái giao din mà WinDriver
a to ra  trên, và bt tay vào to mt giao din ca chính chúng ta. Vi
phng châm càng n gin càng tt nên hng dn này tôi ch to mt giao
din ch vi 2 Button và 2 textBox dùng u khin nh sau:
Nguyn Ngc Hng Lp TKTL 40 HVKTQS
- 4 -
y là song bc u tiên, bc tip theo là add 2 th vin  trên vào trong
project ca mình và nghiên cu cách s dng chúng. Nu bn add thành công thì
n s thy chúng nh sau:
Ta hãy xem chúng có nhng gì ( vic s dng ch yu trên th vin
project_usb_4550_lib.dll):
Th vin này cha 4 u quyn (delegates) dành  to các s kin quan trng
i bus USB và 4 lp, trong ó 3 lp u khin thit b USB và mt lp 
Nguyn Ngc Hng Lp TKTL 40 HVKTQS
- 5 -
qun lý danh sách các thit b USB khác nhau c gán vào PC. Chúng ta hãy
quan sát c th hn vi các u quyn và các lp này:
-  quyn D_USER_ATTACH_CALLBACK  dng  gán s kin có
thit b USB thích hp gn vào bus USB vi mt hàm callback do bn to ra
thng là khi to vic truyn nhn d liu.
-  quyn D_USER_DETACH_CALLBACK c s dng  gán s
kin thit b USB ã c tháo ra vi mt hàm gi li do bn xây dng thng
là thông báo cho ngui s dng v vic Disconnect và kt thúc vic truyn nhn
-  quyn D_USER_TRANSFER_COMPLETION khá hu ích vì nó s
gán s kin truyn nhn kt thúc vào mt hàm x lý c vit d liu usb do bn
xây dng.
-  quyn D_USER_POWER_CHANGE_CALLBACK ít c s dng
n vì nó liên quan n vic báo ng thay i ngun trên bus USB, bn có th

n dng  thc hin các bin pháp bo m ct ngun bus USB khi có s c.
- p KEY_USB_Device cha các hàm  thc hin vic cài t cu hình
khác nhau cho thit b USB hay hàm c các s hiu VP, IP và hàm theo dõi
trng thái truyn nhn ca thit b:
- p KEY_USB_DeviceManager thc hin vic qun lý thit b USB và
 s lng thit b USB c gn vào:
- p KEY_USB_Pipe có s lng hàm tng i ln và chuyên dng 
c vit d liu kim tra trng thái truyn nhn, kim soát vic khi ng và
ng các ng ng…
- Lp Pipe_list thc hin qun lý các ng ng vào ra ca thit b.
p các hàm này khá linh hot và y  cho mi ng dng USB và bn cng
không cn phi tìm hiu k tt c các hàm ó vì chúng ta ch cn làm vic vi
t s hàm nht nh là  giao tip.
Bây gi là n công vic khó nht ây, ta phi vit code làm sao cho khi gn
thit b vào thì nó phi nhn c và thc hin truyn phát d liu.
Nguyn Ngc Hng Lp TKTL 40 HVKTQS
- 6 -
Ý tng ca tôi là dùng Button1(tên là btwrite)  thc hin vic truyn d liu
c ly trong textBox1(tên là txttrans) t PC xung VK, Button2(btread)
dùng  ly d liu t VK lên PC hin th textBox2(txtLog).
 thut toán thc hin chng trình chúng ta ch hn ch 3 chc nng c bn
là c, vit d liu và phát hin thit b gán vào hay tháo ra (hai s kin nhn
bit thit bu c hin th trên txtLog).
Phn khai báo USING ca chng trình chúng ta cn mt s khai báo nh sau:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;

using System.Windows.Forms;
using System.Runtime.InteropServices;
using System.Runtime.CompilerServices;
using Jungo.wdapi_dotnet; //s dng th vin wdapi_dotnet
using Jungo.project_usb_4550_lib; //s dng th vin project_usb_4550_lib
using wdu_err=Jungo.wdapi_dotnet.WD_ERROR_CODES;//s dng vic khai báo li
using DWORD = System.UInt32;
using WORD = System.UInt16;
using UCHAR = System.Byte;
phn khai báo các bin ca form chính chúng ta thc hin mt s khai báo hàng
bin và to các i tng sau:
private const string DEFAULT_LICENSE_STRING =
"6C3CC2CFE89E7AD04238DF2EF24449E848CDC187.NguyenNgocHung";
// TODO: If you have renamed the WinDriver kernel module (windrvr6.sys),
// change the driver name below accordingly
private const string DEFAULT_DRIVER_NAME = "windrvr6";
private const WORD DEFAULT_VENDOR_ID = 0x04D8;
private const WORD DEFAULT_PRODUCT_ID = 0x0101;
public const DWORD TIME_OUT = 30000;
private PROJECT_USB_4550_DeviceManager uDevManager; //khai báo khi to
vic qun lý i tng USB
private PROJECT_USB_4550_Device usb_device; //khai báo i tng USB
private PROJECT_USB_4550_Pipe usb_pipe_trs; //khai báo i tng ng truyn
private PROJECT_USB_4550_Pipe usb_pipe_rev; //khai báo i tng ng nhn
private delegate void D_ATTACH_GUI_CALLBACK(PROJECT_USB_4550_Device pDev);
//khai báo y quyn thông báo thit b gn vào
private delegate void D_DETACH_GUI_CALLBACK(PROJECT_USB_4550_Device pDev);
//khai báo y quyn thông báo thit b tháo ra
delegate void safeLogTextCallBack(string sMsg); //khai báo y quyn phc v
hin th

Chúng ta ã có 1 i tng qun lý USB, 1 i tng thit b USB, 2 i tng
ng ng TRANSFER và RECEIVER, các kt ni, khai báo driver u khin
và các u quyn cn thit. Tip theo chúng ta s xây dng các hàm ca form
theo các s kin chính. S kin u tiên chúng ta cn quan tâm là “form load”
vì nó xy ra u tiên trong chui s kin vì vy có th tn dng  khi to mt
 bin, i tng cho chng trình.
private void form_main_Load(object sender, EventArgs e)
{
// ng ký hai hàm s kin ATTACH_CALLBACK & DETACH_CALLBACK
Nguyn Ngc Hng Lp TKTL 40 HVKTQS
- 7 -
D_USER_ATTACH_CALLBACK dDeviceAttachCb = new
D_USER_ATTACH_CALLBACK(UserDeviceAttach);
D_USER_DETACH_CALLBACK dDeviceDetachCb = new
D_USER_DETACH_CALLBACK(UserDeviceDetach);
//khi to i tng qun lý thit b USB
uDevManager = new
PROJECT_USB_4550_DeviceManager(dDeviceAttachCb, dDeviceDetachCb,
DEFAULT_VENDOR_ID, DEFAULT_PRODUCT_ID, DEFAULT_DRIVER_NAME,
DEFAULT_LICENSE_STRING);
}
Hàm 2 callback x lý 2 s kin Attacth và Detach theo c cu trung gian c
i n 2 hàm UserDeviceAttach & UserDeviceDetach  khi to các i
ng AttachCb và DetachCb . Trong hàm này còn thc hin vic khi to thit b
USB và hai ng ng TRANSFER & RECEIVER.
private void UserDeviceAttach(PROJECT_USB_4550_Device pDev)
{
D_ATTACH_GUI_CALLBACK AttachCb = new
D_ATTACH_GUI_CALLBACK(DeviceAttachGuiCb);
// khi to thit b USB

usb_device = pDev;
// khi to ng ng nhn và truyn
usb_pipe_rev =
(PROJECT_USB_4550_Pipe)usb_device.GetpPipesList()[1];
usb_pipe_trs =
(PROJECT_USB_4550_Pipe)usb_device.GetpPipesList()[2];
Invoke(AttachCb, new object[] {pDev});
}
Và:
private void UserDeviceDetach(PROJECT_USB_4550_Device pDev)
{
D_DETACH_GUI_CALLBACK DetachCb = new
D_DETACH_GUI_CALLBACK(DeviceDetachGuiCb);
Invoke(DetachCb, new object[] { pDev });
}
Các hàm DeviceAttachGuiCb & DeviceDetachGuiCb ch là các hàm hin th trng
thái thit b gn vào hay tháo ra.
private void DeviceAttachGuiCb(PROJECT_USB_4550_Device pDev)
{
TraceMsg("Found new device\r\n");
TraceMsg("Your new device is installed and ready to use\r\n");
}
private void DeviceDetachGuiCb(PROJECT_USB_4550_Device pDev)
{
TraceMsg("Your device has detached\r\n");
}
 thun li cho vic hin th trng thái chng trình chúng ta nên b xung mt
 hàm u khin vic xut thông báo ví d 3 hàm di ây:
private void SafeLogText(string sMsg)
{

// InvokeRequired compares the thread ID of the
// calling thread to the thread ID of the creating thread.
// If these threads are different, it returns true.
if (txtLog.InvokeRequired)
{
Nguyn Ngc Hng Lp TKTL 40 HVKTQS
- 8 -
safeLogTextCallBack cb = new
safeLogTextCallBack(SafeLogText);
this.Invoke(cb, new object[] { sMsg });
}
else
{
txtLog.AppendText(sMsg);
}
}
public void TraceMsg(string sMsg)
{
SafeLogText(sMsg);
}
Bây gi ta bt tay vào vic xây dng hàm dùng  truyn nhn d liu. Khi nhn
vào button write thì thc hin truyn mt byte xung VK:
private void btwrite_Click(object sender, EventArgs e)
{
SingleTransfer();
}
Hàm SingleTransfer(); thc hin vit s ly 1 byte ã nhp vào txttrans và
chuyn sang dng byte  trong buffer sau ó gi hàm truyn không ng b:
usb_pipe_trs.UsbPipeTransferAsync(false, 0, buffer,
dwBuffSize, TIME_OUT, new

D_USER_TRANSFER_COMPLETION(Transfer_trs_Completion));
Khi nhn vào button read thì thc hin nhn mt byte t VK lên PC và hin
th ra txtLog.
private void btread_Click(object sender, EventArgs e)
{
SingleReceiver();
}
Hàm SingleReceiver(); tng t nh hàm SingleTransfer(); thc hin vic
nhn d liu vào bm:
usb_pipe_rev.UsbPipeTransferAsync(true, 0, buffer,
dwBuffSize, TIME_OUT, new
D_USER_TRANSFER_COMPLETION(Transfer_rev_Completion));
Các hàm Transfer_trs_Completion & Transfer_rev_Completion thc hin vic
thông báo hoàn thành truyn hoc nhn. Hàm DisplayHexBuffer  h tr vic
hin th giá tr thâp lc phân.
Sau ây là toàn b mã ca chng trình:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using System.Runtime.CompilerServices;
using Jungo.wdapi_dotnet;
using Jungo.project_usb_4550_lib;
using wdu_err = Jungo.wdapi_dotnet.WD_ERROR_CODES;
using DWORD = System.UInt32;
Nguyn Ngc Hng Lp TKTL 40 HVKTQS

- 9 -
using WORD = System.UInt16;
using UCHAR = System.Byte;
namespace project_usb_4550
{
public partial class form_main : Form
{
private const string DEFAULT_LICENSE_STRING =
"6C3CC2CFE89E7AD04238DF2EF24449E848CDC187.NguyenNgocHung";
private const string DEFAULT_DRIVER_NAME = "windrvr6";
private const WORD DEFAULT_VENDOR_ID = 0x04D8;
private const WORD DEFAULT_PRODUCT_ID = 0x0101;
public const DWORD TIME_OUT = 30000;
private PROJECT_USB_4550_DeviceManager uDevManager;
private PROJECT_USB_4550_Device usb_device
private PROJECT_USB_4550_Pipe usb_pipe_trs;
private PROJECT_USB_4550_Pipe usb_pipe_rev;
private delegate void D_ATTACH_GUI_CALLBACK(PROJECT_USB_4550_Device
pDev);
private delegate void D_DETACH_GUI_CALLBACK(PROJECT_USB_4550_Device
pDev);
delegate void safeLogTextCallBack(string sMsg);
public form_main()
{
InitializeComponent();
}
private void form_main_Load(object sender, EventArgs e)
{
D_USER_ATTACH_CALLBACK dDeviceAttachCb = new
D_USER_ATTACH_CALLBACK(UserDeviceAttach);

D_USER_DETACH_CALLBACK dDeviceDetachCb = new
D_USER_DETACH_CALLBACK(UserDeviceDetach);
uDevManager = new
PROJECT_USB_4550_DeviceManager(dDeviceAttachCb, dDeviceDetachCb,
DEFAULT_VENDOR_ID, DEFAULT_PRODUCT_ID, DEFAULT_DRIVER_NAME,
DEFAULT_LICENSE_STRING);
}
private void UserDeviceAttach(PROJECT_USB_4550_Device pDev)
{
D_ATTACH_GUI_CALLBACK AttachCb = new
D_ATTACH_GUI_CALLBACK(DeviceAttachGuiCb);
usb_device = pDev;
usb_pipe_rev =
(PROJECT_USB_4550_Pipe)usb_device.GetpPipesList()[1];
usb_pipe_trs =
(PROJECT_USB_4550_Pipe)usb_device.GetpPipesList()[2];
Invoke(AttachCb, new object[] {pDev});
}
private void DeviceAttachGuiCb(PROJECT_USB_4550_Device pDev)
{
TraceMsg("Found new device\r\n");
TraceMsg("Your new device is installed and ready to use\r\n");
}
private void UserDeviceDetach(PROJECT_USB_4550_Device pDev)
{
D_DETACH_GUI_CALLBACK DetachCb = new
D_DETACH_GUI_CALLBACK(DeviceDetachGuiCb);
Invoke(DetachCb, new object[] { pDev });
}
Nguyn Ngc Hng Lp TKTL 40 HVKTQS

- 10 -
private void DeviceDetachGuiCb(PROJECT_USB_4550_Device pDev)
{
TraceMsg("Your device has detached\r\n");
}
private void SafeLogText(string sMsg)
{
// InvokeRequired compares the thread ID of the
// calling thread to the thread ID of the creating thread.
// If these threads are different, it returns true.
if (txtLog.InvokeRequired)
{
safeLogTextCallBack cb = new
safeLogTextCallBack(SafeLogText);
this.Invoke(cb, new object[] { sMsg });
}
else
{
txtLog.AppendText(sMsg);
}
}
public void TraceMsg(string sMsg)
{
SafeLogText(sMsg);
}
private void btwrite_Click(object sender, EventArgs e)
{
SingleTransfer();
}
private void SingleTransfer()

{
DWORD dwBuffSize = 1;
byte[] buffer = new byte[1];
string txt = txttrans.Text;
buffer[0] = Convert.ToByte(txt[0]);
usb_pipe_trs.UsbPipeTransferAsync(false, 0, buffer,
dwBuffSize, TIME_OUT, new
D_USER_TRANSFER_COMPLETION(Transfer_trs_Completion));
}
private void Transfer_trs_Completion(PROJECT_USB_4550_Pipe pipe)
{
if (pipe.GetTransferStatus() ==
(DWORD)wdu_err.WD_STATUS_SUCCESS)
{
TraceMsg("Transfer completed successfully!\r\n ");
}
else
{
TraceMsg("tranfer fail\r\n");
}
}
private void btread_Click(object sender, EventArgs e)
{
SingleReceiver();
}
private void SingleReceiver()
{
DWORD dwBuffSize = 1;
byte[] buffer = new byte[1];
usb_pipe_rev.UsbPipeTransferAsync(true, 0, buffer,

Nguyn Ngc Hng Lp TKTL 40 HVKTQS
- 11 -
dwBuffSize, TIME_OUT, new
D_USER_TRANSFER_COMPLETION(Transfer_rev_Completion));
}
private void Transfer_rev_Completion(PROJECT_USB_4550_Pipe pipe)
{
if (pipe.GetTransferStatus() ==
(DWORD)wdu_err.WD_STATUS_SUCCESS)
{
TraceMsg(DisplayHexBuffer(pipe.GetBuffer(),1));
}
else
{
TraceMsg("receiver failure!\r\n");
}
}
private string DisplayHexBuffer(byte[] buff, DWORD dwBuffSize)
{
string display = "";
for (DWORD i = 0; i < dwBuffSize; i++)
display = string.Concat(display, buff[i].ToString("X")," ");
display = string.Concat(display, Environment.NewLine);
return display;
}
}
}

×