Tôi đang viết một ứng dụng cần gửi dữ liệu ra cổng USB trong VB 6 . Bác nào biết xin giúp đỡ (chẳng hạn như dùng điều khiển nào , khai báo thế nào ...). , càng cụ thể càng tốt .
Thông báo
Collapse
No announcement yet.
Gửi dữ liệu ra cổng USB trong VB
Collapse
This is a sticky topic.
X
X
-
Tôi mới đọc cuốn USB_complete.pdf của Alexan viết rất hay và đầy đủ về giao tiếp qua USB Interface, tốc độ cách ghép nối, giao thức truyền. Tôi nghĩ bạn nên đọc cuốn này. Nếu cần thì email cho tôi: haibac.ac.hut@gmail.com.
Nếu bạn muốn viết giao tiếp với PC qua cổng USB trong VB thì bạn cần phải dùng các hàm trong API. Bạn không cần thêm các điều khiển ActiveX nào cả mà nó có ngay trong hệ thống của bạn. Bạn cần phải khai báo để cho nó biết là bạn đang dùng thư viện nào trong hệ thống. Các hàm này bạn phải khai báo trong một modul của dự án của bạn trong đó có dùng các thư viện liên kết như user32.dll,.. trong windows/system32. Các hàm này bạn phải tự tạo ra trên cơ sở của các thư viện liên kết động này( cụ thể là bạn tham khảo các file này trong C rồi chuyển qua VB với một số điều chú ý về kiểu dữ liệu, các file gồm: hdi.h, setupapi.h(tôi tìm chỉ có file này)).
Bạn có thể tham khảo các khai báo API viết ứng dụng trong MSDN hoặc trong những site sau rất hay, cho phép bạn download những modul của các nhà phát triển rất là hay:
http://www.vbcodesource.com/bas.html (hay nhất)
http://msdn.microsoft.com
http://www.usb.org/share-cgi-bin/search
http://www.allapi.net/ (cực hay)
http://www.vbforums.com/
http://www.freevbcode.com/
http://www.andreavb.com/
Mình sẽ viết ví dụ cụ thể cho bạn sau. Tối qua đọc mệt quá. Đề tài này hay đấy. Bà con cùng trao đổi nhé.Technical sale at WT Microelectronics S'pore
Hỗ trợ dự án sử dụng các hãng Texas Instrument, STMicro, Freescale, Fairchild, International Rectifier, Ublox, Lumiled, Maxim
Liên hệ: 0915.560.511 hoặc ngo.haibac@wtmec.com
-
Mình thấy site này rất là hay liệt kê đầy đủ các hàm khai báo trong các thư viện liên kết động mà ta cần dùng và ý nghĩa của từng hàm, bạn nên vào đây:
http://www.andreavb.com/API_List.html
Ví dụ một hàm trong thư viện advapi32.dll
;Khai báo
Option Explicit
'API Calls
'Function InitiateSystemShutDown
'lpMachineName : string that specifies the network name of the computer to shut down. If lpMachineName is an empty string, the function shuts down the local computer.
'lpMessage : string that specifies a message to display in the shutdown dialog box. This parameter can be NULL if no message is required.
'dwTimeout : Specifies the time (in seconds) that the dialog box should be displayed. While this dialog box is displayed, the shutdown can be stopped by the AbortSystemShutdown function.
' If dwTimeout is not zero, InitiateSystemShutdown displays a dialog box on the specified computer. The dialog box displays the name of the user who called the function, displays the message specified by the lpMessage parameter, and prompts the user to log off. The dialog box beeps when it is created and remains on top of other windows in the system. The dialog box can be moved but not closed. A timer counts down the remaining time before a forced shutdown. If the user logs off, the system shuts down immediately. Otherwise, the computer is shut down when the timer expires.
'
' If dwTimeout is zero, the computer shuts down without displaying the dialog box, and the shutdown cannot be stopped by AbortSystemShutdown.
'bForceAppsClosed : Specifies whether applications with unsaved changes are to be forcibly closed. If this parameter is TRUE, such applications are closed. If this parameter is FALSE, a dialog box is displayed prompting the user to close the applications.
'bRebootAfterShutdown : Specifies whether the computer is to restart immediately after shutting down. If this parameter is TRUE, the computer is to restart. If this parameter is FALSE, the system flushes all caches to disk, clears the screen, and displays a message indicating that it is safe to power down.
'
'To shut down the local computer, the calling process must have the SE_SHUTDOWN_NAME privilege. To shut down a remote computer, the calling process must have the SE_REMOTE_SHUTDOWN_NAME privilege on the remote computer. By default, users can enable the SE_SHUTDOWN_NAME privilege on the computer they are logged onto, and administrators can enable the SE_REMOTE_SHUTDOWN_NAME privilege on remote computers.
Public Declare Function InitiateSystemShutdown Lib "advapi32.dll" Alias "InitiateSystemShutdownA" (ByVal lpMachineName As String, ByVal lpMessage As String, ByVal dwTimeout As Long, ByVal bForceAppsClosed As Long, ByVal bRebootAfterShutdown As Long) As Long
'Function AbortSystemShutDown
'lpMachineName : string that specifies the network name of the computer where the shutdown is to be stopped. If lpMachineName is an empty string, the function stops the shutdown on the local computer.
Public Declare Function AbortSystemShutdown Lib "advapi32.dll" Alias "AbortSystemShutdownA" (ByVal lpMachineName As String) As Long
Các sử dụng:
Private Sub Command1_Click()
'Initiate a System ShutDown on the remote PC called MYPC, a window will display
'the message and after 30 seconds the system will shut down forcing every
'application to stop. The system will be restarted
InitiateSystemShutdown "\\MYPC", "The system is Shutting Down", 30, True, True
End Sub
Private Sub Command2_Click()
'If before the 30 seconds elapse the user calls this function, the Shut down
'process will be aborted
AbortSystemShutdown "\\MYPC"
End SubTechnical sale at WT Microelectronics S'pore
Hỗ trợ dự án sử dụng các hãng Texas Instrument, STMicro, Freescale, Fairchild, International Rectifier, Ublox, Lumiled, Maxim
Liên hệ: 0915.560.511 hoặc ngo.haibac@wtmec.com
Comment
-
Tôi có tìm được trên trang http://www.planetsourcecode.com một bài viết về vấn đề này , người viết có nói là có thể gửi dữ liệu ra cổng USB nhờ dùng hàm trong thư viện dlportio.dll (có code kèm theo nhưng là với cổng máy in ) nhưng bài viết không kèm file thư viện này .Bạn thử tham khảo và cho tôi ý kiến nhé (tôi chỉ là lính mới trong lập trình VB thôi ) .Nếu bạn tìm được file dlportio.dll thì gửi cho tôi (Code down dược tôi gửi kèm bài trả lời)
Cám ơn bạn đã giúp đỡ .Last edited by zoz; 25-11-2005, 18:13.
Comment
-
các bác ơi quyển USB_complete.pdf đây. Các bác mang về mà đọc nghe.
Mình đang bận thi quá trời. Chẳng biết có viết được cho các bác xem không. Các bác cứ thảo luận đi nhé.
http://luckytoki.com/haibac/download...Complete_3.rarTechnical sale at WT Microelectronics S'pore
Hỗ trợ dự án sử dụng các hãng Texas Instrument, STMicro, Freescale, Fairchild, International Rectifier, Ublox, Lumiled, Maxim
Liên hệ: 0915.560.511 hoặc ngo.haibac@wtmec.com
Comment
-
Tài liệu này của bạn cũng rất hay nhưng nói không cung phu bằng quyển serial_complete3. Bạn cứ học các cuốn này đi, tìm hiểu về giao thức, cách lập trình của nó. Tôi viết được một phần nào chương trình nhưng khi cắm cái USB vào chạy thì chẳng được gì cả. Chắc là chưa tìm hiểu kĩ. Tôi sẽ tìm hiểu kĩ về vấn đề này. Mong các bạn có kiến thức uyên thâm về nó thì vào đây trao đổi: cách viết driver cho các thiết bị ngoại vi( trong serial_complete nói khá rõ về giao thức, cách tìm kiếm thiết bị, biết địa chỉ ID của thiết bị, gửi dữ liệu, nhận dữ liệu). Để mình tìm hiểu biết được gì mình sẽ port lên phần nào giúp cùng các bạn lập trình thành công, hiểu được giao thức mới USB.
Xin gửi các bạn đường link đến mấy cài file có mã hàm của các hàm API( application programer interface) dùng cho lập trình HID và một số thư viện:
http://luckytoki.com/haibac/download/Visual%20Basic/Technical sale at WT Microelectronics S'pore
Hỗ trợ dự án sử dụng các hãng Texas Instrument, STMicro, Freescale, Fairchild, International Rectifier, Ublox, Lumiled, Maxim
Liên hệ: 0915.560.511 hoặc ngo.haibac@wtmec.com
Comment
-
tài liệu HID 1.12 : (HID Usage Tables 1.12)
http://www.usb.org/developers/devclass_docs/Hut1_12.pdf
Comment
-
Bạn có biết về các hàm :
HidD_FreePreparsedData
HidD_GetAttributes
HidD_GetHidGuid
HidD_GetPreparsedData
HidP_GetCaps
HidP_GetValueCaps
trong thư viện hid.dll
Nếu được xin cho biết ý nghĩa hàm và tham số của nó (tôi tìm trong MSDN 2001 không thấy có các hàm này)
Comment
-
được rồi để mình về nhà xem đã bạn ạ.
Mình đã đọc cuốn USB-Complete để mai mình đưa cụ thể mấy hàm này cho bạn vì mình đang viết về Serial Port nên chưa có thời gian làm cái này. Tuy nhiên mình sẽ tìm cho bạn mấy cái hàm này.
để bạn có thể tìm hiểu sâu các hàm API trong thư system32 mình cho bạn phần mềm này hi vọng sẽ giúp đỡ bạn một phần, cái này có đẩy đủ đấy:
http://www.student.kuleuven.ac.be/~m....7/agsetup.exeTechnical sale at WT Microelectronics S'pore
Hỗ trợ dự án sử dụng các hãng Texas Instrument, STMicro, Freescale, Fairchild, International Rectifier, Ublox, Lumiled, Maxim
Liên hệ: 0915.560.511 hoặc ngo.haibac@wtmec.com
Comment
-
mình xin trả lời chi tiết bạn về ý nghĩa của các hàm cùng tham số của nó:
Giao tiếp với HID không đơn giản chỉ là mở port, thiết lập một vài tham số sau đó đọc và ghi dữ liệu, như làm với RS232 hay cổng song song. Trước khi một ứng dụng có thể trao đổi dữ liệu với HID, nó phải nhận ra được thiết bị và nhận thông tin về thiết bị đó. Để làm điều đó thì ứng dụng phải chạy một vài vòng bằng cách gọi một loạt các hàm API. Ứng dụng đầu tiên tìm xem thiết bị đã được gắn kết với hệ thống chưa. Sau khi tìm thấy nó trao đổi thông tin với thiết bị bằng các gửi và nhận thông tin.
** HidD_GetHidGuid:
Nhiệm vụ đàu tiên là càn phải tìm được thiết bị mà ứng dụng muốn liên kết với. Việc này bao gồm kiểm tra tính chất của lớp HID hiện diện trong hệ thống của bạn và tìm kiếm thông tin về nó như nhà sản xuất, ID của thiết bị, khả năng làm việc của thiết bị. Một loạt các hàm API sẽ hoàn thành công việc này. GUID là gía trị 128 bit,
Code:Public Declare Function HidD_GetHidGuid Lib "hid.dll" _ (ByRef HidGuid As GUID) As Long Bạn có thể dùng hàm trên để lấy giá trị GUID cho HID class. HidGuid dùng kiểu GUID là kiểu định nghĩa bởi người dùng: Public Type GUID Datal As Long Data2 As Integer Data3 As Integer Data4(7) As Byte End Type
Code:Call HidD_GetHidGuid(HidGuid) ‘ hoặc là gọi để lấy giá trị Dim Result as Long Result = HidD_GetHidGuid(HidGuid)
Code:Public Declare Function HidD GetAttributes Lib "hid.dll" _ (ByVal HidDeviceObject As Long, ByRef _ Attributes As HIDD_ATTRIBUTES) As Long ‘định nghĩa kiểu HIDD_ATTRIBUTES Public Type HIDD_ATTRIBUTES Size As Long VendorID As Integer ProductID As Integer VersionNumber As Integer End Type ‘ gọi hàm Dim DeviceAttributes As HIDD_ATTRIBUTES 'Set the Size property to the number of bytes 'in the structure. DeviceAttributes.Size = LenB(DeviceAttributes) Result = HidD_GetAttributes(HidDevice,DeviceAttributes)
Chi tiết: HidDevice là handle đến đối tượng mà ta nhận được từ hàm CreateFile.
*** HidD_FreePreparsedData
Code:‘ngắt kết nối với thiết bị Public Declare Function HidD_FreePreparsedData Lib "hid.dll" (ByRef_ PreparsedData As Long)As Long
HidD_GetPreparsedData
Lấy con trỏ tới bộ nhớ đệm với khả năng của thiết bị
Code:Public Declare Function HidD_GetPreparsedData Lib "hid.dll" _ (ByVal HidDeviceObject As Long, ByRef PreparsedData As Long) As Long ‘ gọi hàm Result = HidD_GetPreparsedData(HidDevice, PreparsedData)
Get the Device's Capabilities( lấy khả năng của thiết bị)
Code:Public Declare Function HidP_GetCaps Lib "hid.dll" _ (ByVal PreparsedData As Long, ByRef Capabilities As HIDP_CAPS) As Long ‘ định nghĩa cấu trúc HIDP_CAPS Public Type HIDP_CAPS Usage As Integer UsagePage As Integer InputReportByteLength As Integer OutputReportByteLength As Integer FeatureReportByteLength As Integer Reserved(16) As Integer NumberLinkCollectionNodes As Integer NumberlnputButtonCaps As Integer NumberlnputValueCaps As Integer NumberlnputDatalndices As Integer NumberOutputButtonCaps As Integer NumberOutputValueCaps As Integer NumberOutputDatalndices As Integer NumberFeatureButtonCaps As Integer NumberFeatureValueCaps As Integer NumberFeatureDatalndices As Integer End Type ‘ cách gọi hàm. Result = HidP_GetCaps(PreparsedData,Capabilities)
HidP_GetValueCaps trả lại con trỏ tới một mảng bao gồm thông tin về mỗi giá trị trong một báo cáo
Những cái này đều nói rất rõ trong usb_completeLast edited by ngohaibac; 01-01-2006, 11:17.Technical sale at WT Microelectronics S'pore
Hỗ trợ dự án sử dụng các hãng Texas Instrument, STMicro, Freescale, Fairchild, International Rectifier, Ublox, Lumiled, Maxim
Liên hệ: 0915.560.511 hoặc ngo.haibac@wtmec.com
Comment
-
cảm ơn bạn ngohaibac!(tôi cũng có quyển usb_complete nhưng do bận thi nên chưa có thời gian đọc) . Để làm rõ hơn về vấn đề này tôi có dịch một bài viết trên mạng , mời các bạn tham khảo (đây là phần đầu):
********
Việc viết các ứng dụng chuyển dữ liệu qua USB là rất phức tạp và tốn công sức nếu như định thực hiện ở mức viết trình điều khiển nhưng rất may là chúng ta có thể sử dụng lớp HID thay thế . Lớp HID thực ra là sự phân loại thiết bị chuẩn cho giao tiếp USB , nó không ứng với tập hợp những thiết bị chức năng cố định mà hỗ trợ nhiều loại thiết bị với những đặc trưng khác nhau như chuột, bàn phím, dụng cụ y tế , thiết bị âm thanh,hình ảnh …. Microsoft cũng hỗ trợ lớp HID với một thư viện rộng lớn như là một phần của Windown DDK .
Gắn kết thiết bị vào USB
Quá trình nhận thiết bị bắt đầu với việc xác định tốc độ thiết bị qua điện trở kéo bên trong . Máy tính xác định điều này và bắt đầu quá trình liệt kê (enumeration) (riêng với high speed còn phải qua một quá trình xử lý nữa ) . Trong suốt quá trình liệt kê , máy tính yêu cầu một số cấu trúc dữ liệu (hay còn gọi là descriptor) từ phía thiết bị . Những descriptor này chứa thông tin về số và loại của những kênh truyền thông dữ liệu , hay còn gọi là endpoint , mà thiết bị USB sử dụng , cũng như thông tin về bất kỳ lớp thiết bị nào . Việc liệt kê xảy ra trên endpoint mặc định , endpoint 0 , ngoài ra cũng là control endpoint . Máy tính giao cho thiết bị một địa chỉ 7-bit duy nhất , định hướng truyền thông tới mỗi thiết bị cụ thể .
Trên máy tính phần , đầu tiên của quá trình liệt kê xảy ra mà không có các driver thiết bị class-specific . trong suốt phần này , trình điều khiển USB nhận những descriptor chung mà mọi thiết bị hỗ trợ và cho thiết bị một địa chỉ duy nhất . Nếu những descriptor chỉ ra rằng thiết bị phụ thuộc vào một lớp thiết bị USB cụ thể nào đó , trình điều khiển USB sẽ giao phần còn lại của quá trình liệt kê cho trình điều khiển thiết bị USB đã được xác định đó . Ở đây như chúng ta đã bàn đó là trình điều khiển HID-class . Nếu các descriptor không xác định một lớp cụ thể nào , thì sau đó VID và PID của thiết bị , lấy từ những descriptor , sẽ nhận diện một trình điều khiển thích hợp cho thiết bị USB .
Trong một thiết bị USB HID được thiết kế phù hợp , ta sẽ không cần quan tâm về quá trình này . Những trình điều khiển thiết bị trên máy chủ USB sẽ thực hiện quá trình liệt kê và xác định trình điều khiển lớp cho chúng ta . Máy chủ USB chỉ đơn giản liệt kê thiết bị và sau đó sẵn sàng cho ứng dụng của ta . Tuy nhiên , nếu định dạng không đúng các descriptor hay thiết bị đáp ứng không phù hợp , hoặc trình điều khiển USB hoặc trình điều khiển lớp sẽ cấm thiết bị , điều này phụ thuộc vào thời điểm lỗi xảy ra trong quá trình liệt kê .
HID
Thực chất một thiết bị đòi hỏi phụ thuộc vào lớp Human Interface Device không cần thiết phải có sự giao tiếp với con người . Lớp HID hỗ trợ rất nhiều loại thiết bị như chuột hay bàn phím hoặc có thể là IC được lập trình hay cảm biến nhiệt … thậm chí là những thiết bị đơn giản như LED , nút bấm hay một LCD …
Lớp HID cho phép tạo một tập hợp HID usages để mô tả thiết bị . HID report descriptor , cái mà máy chủ USB thu được trong quá trình liệt kê , mô tả tập hợp này cùng với luồng dữ liệu vào ra . Chẳng hạn mô tả đồng hồ có thể có luồng dữ liệu vào là 3 byte ứng vớI giờ , phút , giây . Đồng hồ cũng phải có một báo cáo ra (out report) trong tập hợp mà đã mô tả cách viết lên một màn hình LCD . Lớp HID cũng có khả năng cho phép vendor-defined usages. Mặc dù nếu không có những usage được xác định trước trong bảng HID usage có thể mô tả thiết bị của mình , chúng ta vẫn có thể dự trữ trước một khe vendor-defined chung trong tập hợp HID report .
Mặc dù bị giới hạn về băng thông nhưng việc dùng HID là đáp ứng đủ cho hầu hết mọi ứng dụng .
*********
Nếu thấy bài viết này là không cần thiêt , các bạn cứ cho ý kiến!
Comment
-
Được đó bạn, chương trình viết giao tiếp qua USB có thể viết trên VB hoặc VC++.
Bạn làm trên VB đi, mình sẽ làm trên VC++ nha. Nhưng mình chưa làm ngay được đang bận lắm. Cố gắng làm tốt nha.
Thế nhé.Technical sale at WT Microelectronics S'pore
Hỗ trợ dự án sử dụng các hãng Texas Instrument, STMicro, Freescale, Fairchild, International Rectifier, Ublox, Lumiled, Maxim
Liên hệ: 0915.560.511 hoặc ngo.haibac@wtmec.com
Comment
Bài viết mới nhất
Collapse
-
bởi yname11 E có 1 laptop bị hỏng màn hình, e tháo ra thì thấy nó có 4 lớp , lớp ngoài cùng là 1 lớp nhựa rất mỏng màu hơi đen ( chắc là 1 loại film dán), tiếp theo là 1 lớp thủy tinh bị vỡ (màu đen) , đến 1 lớp thủy tinh trắng ( lớp này có...
-
Channel: Thiết bị điện tử cá nhân
Hôm qua, 19:12 -
-
Trả lời cho Mua anten ở đâu?bởi tmcodonAnten bạn thu nguồn sóng nào vậy? Nếu xem truyền hình thì giờ k làm đc anten nữa rồi
-
Channel: Ăng ten và truyền sóng
16-11-2024, 15:34 -
-
Trả lời cho Mạch nguồn đôi dùng 7812 và 7912bởi tmcodonThank bác nhá. Tìm mãi mới thấy. Giờ vọc đã xem sao...
-
Channel: Hỗ trợ học tập
16-11-2024, 10:39 -
-
bởi tungdqEm cần tìm sơ đồ mạch một số Main máy tính đời cao như Asrock B560M-HDV, các cao nhân chỉ giúp với. Thank!
-
Channel: Các mạch điện ứng dụng
15-11-2024, 08:27 -
-
Trả lời cho Kiểm tra biến ápbởi lamvu0677nhân tiện cho mình hỏi thêm về cái phần test hipot (cao áp),là để kiểm tra độ bền cách điện giưa các cuộn dây,mà thấy thông số test thường ở mức 4kvac,vậy nếu mấy con fail đó xài bình thường vẫn dduocj phải không ạ,vì điện mình làm gì lên tới mức đó
-
Channel: Điện tử dành cho người mới bắt đầu
10-11-2024, 08:52 -
-
Trả lời cho Kiểm tra biến ápbởi lamvu0677máy đo số vòng thì cty có ,mà nó to quá,tưởng có máy nào gọn gọn bỏ túi được thì tiện hơn,vì đi lại nhiều...
-
Channel: Điện tử dành cho người mới bắt đầu
10-11-2024, 08:47 -
-
bởi tmcodonMình thấy diễn đàn có chuyên mục quảng cáo rồi mà. Bạn đóng góp để mở luồng riêng
-
Channel: Hướng dẫn sử dụng diễn đàn
09-11-2024, 13:36 -
-
bởi Nicole08Xin chào mọi người, tôi đã sử dụng Flashforge Inventor 2 được gần 5 năm và rất hài lòng với nó, nhưng tuần trước đã xảy ra sự cố. Có vẻ như động cơ bước đưa sợi in vào đầu nóng đã bị hỏng. Mọi thứ khác có vẻ ổn trên máy...
-
Channel: Điện tử dành cho người mới bắt đầu
09-11-2024, 12:55 -
Comment