Nguy 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:
-1-
Nguy n Ng c H ng L p TKTL 40 HVKTQS
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.
-2-
Nguy 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:
-3-
Nguy n Ng c H ng L p TKTL 40 HVKTQS
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
project_usb_4550_lib.dll):
d ng ch
y u trên th
vi n
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
-4-
Nguy 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 :
s l
p KEY_USB_DeviceManager th c hi n vi c qu n lý thi t b USB và
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.
-5-
Nguy n Ng c H ng L p TKTL 40 HVKTQS
Ý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
using
using
using
using
using
using
using
using
System;
System.Collections.Generic;
System.ComponentModel;
System.Data;
System.Drawing;
System.Text;
System.Windows.Forms;
System.Runtime.InteropServices;
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
-6-
Nguy 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à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)
{
-7-
Nguy n Ng c H ng L p TKTL 40 HVKTQS
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();
chuy n sang d ng byte
th c hi n vi t s l y 1 byte ã nh p vào txttrans và
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();
nh n d li u vào b
m:
th c hi n vi c
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
using
using
using
using
using
using
using
using
System;
System.Collections.Generic;
System.ComponentModel;
System.Data;
System.Drawing;
System.Text;
System.Windows.Forms;
System.Runtime.InteropServices;
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;
-8-
Nguy 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
private
private
private
private
PROJECT_USB_4550_DeviceManager uDevManager;
PROJECT_USB_4550_Device usb_device
PROJECT_USB_4550_Pipe usb_pipe_trs;
PROJECT_USB_4550_Pipe usb_pipe_rev;
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 });
}
-9-
Nguy n Ng c H ng L p TKTL 40 HVKTQS
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,
- 10 -
Nguy 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;
}
}
}
- 11 -
- Xem thêm -