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
 
  • Lọc
  • Giờ
  • Show
Clear All
new posts

  • Gửi dữ liệu ra cổng USB trong VB

    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 .
    Last edited by zoz; 25-12-2005, 12:16.

  • #2
    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

    Comment


    • #3
      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 Sub
      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


      • #4
        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


        • #5
          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.rar
          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


          • #6
            Tôi thấy nói lập trình giao tiếp thiết bị qua cổng USB nếu dùng HID (Human Interface Device) thì dễ dàng hơn.Bác nào có kinh nghiệm hay sách (tiếng Việt càng tốt) về đề tài này thì chỉ giáo cho anh em biết với !

            Comment


            • #7
              Tôi có tìm được tài liệu này , mời các bạn đọc tham khảo (cho biết ý kiến càng tốt).

              Comment


              • #8
                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


                • #9
                  tài liệu HID 1.12 : (HID Usage Tables 1.12)
                  http://www.usb.org/developers/devclass_docs/Hut1_12.pdf

                  Comment


                  • #10
                    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


                    • #11
                      đượ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.exe
                      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


                      • #12
                        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
                        Cách gọi hàm:

                        Code:
                        Call HidD_GetHidGuid(HidGuid) ‘ hoặc là gọi để lấy giá trị
                        Dim Result as Long
                        Result = HidD_GetHidGuid(HidGuid)
                        ***Đọc Vendor and Product IDs

                        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)
                        **** HidP_GetCaps
                        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_complete
                        Last 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


                        • #13
                          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


                          • #14
                            Đượ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


                            • #15
                              Cái này được đó.
                              Thế giới quả là rộng lớn, và có rất nhiều việc phải làm.

                              Comment

                              Về tác giả

                              Collapse

                              zoz Tìm hiểu thêm về zoz

                              Bài viết mới nhất

                              Collapse

                              Đang tải...
                              X