Tài liệu Tài liệu hướng dẫn tự làm thiết bị USB (Phần 3) ppt

11 649 0
Tài liệu Tài liệu hướng dẫn tự làm thiết bị USB (Phần 3) ppt

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

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 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 . 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_DeviceManager uDevManager; private PROJECT _USB_ 4550_Device usb_ device private PROJECT _USB_ 4550_Pipe usb_ pipe_trs; private PROJECT _USB_ 4550_Pipe

Ngày đăng: 13/12/2013, 00:15

Từ khóa liên quan

Tài liệu cùng người dùng

Tài liệu liên quan