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
Trang 1Nguy n Ng c H ng L p TKTL 40 HVKTQS
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:
Trang 2Ch 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
Trang 3Nguy n Ng c H ng L p TKTL 40 HVKTQS
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:
Trang 4y 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
Trang 5Nguy n Ng c H ng L p TKTL 40 HVKTQS
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
Trang 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
Trang 7Nguy n Ng c H ng L p TKTL 40 HVKTQS
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àmUserDeviceAttach & 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àmDeviceAttachGuiCb & 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) {
Trang 8safeLogTextCallBack 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àmSingleTransfer(); th c hi n vi t s l y 1 byte ã nh p vào txttrans và
chuy n sang d ng byte trongbuffer 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àmSingleReceiver(); t ng t nh hàmSingleTransfer(); 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àmDisplayHexBuffer 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;
Trang 9Nguy n Ng c H ng L p TKTL 40 HVKTQS
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 });
}
Trang 10private 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,
Trang 11Nguy n Ng c H ng L p TKTL 40 HVKTQS
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;
}
}
}