kimlon
驱动牛犊
驱动牛犊
  • 注册日期2003-05-21
  • 最后登录2010-03-07
  • 粉丝0
  • 关注0
  • 积分17分
  • 威望3点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
阅读:1902回复:12

请指导我一下,高级语言跟USB通信的一般步骤。

楼主#
更多 发布于:2003-09-15 08:59
USB的芯片是CY AN2131。
编程语言是DELPHI。

我看了CY的开发组件,他是用C和VB写的。
好像也是用到API函数来打开USB的,那位朋友可以跟我说一下,
要跟USB通信的一些基本步骤。
比如:1,用createfile(xxx,......)
     2,....

如果方便请将VB或C的例程贴出来,非常感谢。

最新喜欢:

abei11abei11
usb_anywhere
驱动小牛
驱动小牛
  • 注册日期2003-07-29
  • 最后登录2005-11-22
  • 粉丝0
  • 关注0
  • 积分3分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2003-09-16 16:00
假如你的usb设备已经完成
那就是一个简单的问题,就跟操作一个串口一样简单

这是一个DataIn的过程
1) CreateFile(m_completeDeviceName+\"\\\\\"+inPipe,
GENERIC_READ, FILE_SHARE_READ,
NULL, OPEN_EXISTING, 0, NULL);
2)ReadFile(m_hRead,  pinBuf,  nReadLen,(unsigned long *) pnBytesRead, NULL);
  
驱网是你们的,也是我们的,归根结底还是大家的!
kimlon
驱动牛犊
驱动牛犊
  • 注册日期2003-05-21
  • 最后登录2010-03-07
  • 粉丝0
  • 关注0
  • 积分17分
  • 威望3点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2003-09-16 16:48
可是用CreateFile要有一个名称的,如串口1为 \'com1\'

那USB用什么名称呀???

我有VB的程序,那位朋友可以帮我转为delphi么?
kimlon
驱动牛犊
驱动牛犊
  • 注册日期2003-05-21
  • 最后登录2010-03-07
  • 粉丝0
  • 关注0
  • 积分17分
  • 威望3点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
地板#
发布于:2003-09-16 16:51
Attribute VB_Name = \"BulkXfer\"

Option Explicit

\' = = = = W I N A P I  = = = =

Public Declare Function CreateFile Lib \"kernel32\" Alias \"CreateFileA\" (ByVal lpFileName As String, ByVal dwDesiredAccess As Long, ByVal dwShareMode As Long, lpSecurityAttributes As Any, ByVal dwCreationDisposition As Long, ByVal dwFlagsAndAttributes As Long, ByVal hTemplateFile As Long) As Long
Public Declare Function CloseHandle Lib \"kernel32\" (ByVal hObject As Long) As Long
Public Declare Function DeviceIoControl Lib \"kernel32\" (ByVal hDevice As Long, ByVal dwIoControlCode As Long, lpInBuffer As Any, ByVal nInBufferSize As Long, lpOutBuffer As Any, ByVal nOutBufferSize As Long, lpBytesReturned As Long, ByVal lpOverlapped As Long) As Long
Public Declare Function GetLastError Lib \"kernel32\" () As Long

\' = = = = C O N S T A N T S = = = =

Public Const GENERIC_READ = &H80000000
Public Const GENERIC_WRITE = &H40000000
Public Const FILE_SHARE_READ = &H1
Public Const FILE_SHARE_WRITE = &H2
Public Const OPEN_EXISTING = 3

Public Const METHOD_BUFFERED = 0
Public Const METHOD_IN_DIRECT = 1
Public Const METHOD_OUT_DIRECT = 2

Public Const MAX_PIPES = 16
Public Const MAX_USB_DEV_NUMBER = 32

Enum ErrorEnum
   eBadParam = -1
   eBadDriver = -2
   eBadPipe = -3
End Enum

Enum EZ_ReadOrWrite
   eWrite = 1
   eRead = 0
End Enum

Public Type SECURITY_ATTRIBUTES
   nLength As Long
   lpSecurityDescriptor As Long
   bInheritHandle As Boolean
End Type

Private Const Ezusb_IOCTL_INDEX = &H800

Public Const IOCTL_Ezusb_GET_PIPE_INFO = _
   &H220000 + METHOD_BUFFERED + (Ezusb_IOCTL_INDEX + 0) * 4

Private Const IOCTL_Ezusb_GET_DEVICE_DESCRIPTOR = _
   &H220000 + METHOD_BUFFERED + (Ezusb_IOCTL_INDEX + 1) * 4

Public Const IOCTL_EZUSB_BULK_READ = _
   &H220000 + METHOD_OUT_DIRECT + (Ezusb_IOCTL_INDEX + 19) * 4

Public Const IOCTL_EZUSB_BULK_WRITE = _
   &H220000 + METHOD_IN_DIRECT + (Ezusb_IOCTL_INDEX + 20) * 4

////////////////////////////////////
////////////////////////////////////
Public Type USBDeviceDescriptorType
   bDescriptorLength As Byte
   bDescriptor As Byte
   iSpecRelease As Integer
   bDeviceClass As Byte
   bDeviceSubClass As Byte
   bDeviceProtocol As Byte
   bMaxPacketSize As Byte
   iVendorID As Integer
   iProductID As Integer
   iDeviceRelease As Integer
   bManufacturer As Byte
   bProduct As Byte
   bSerialNumber As Byte
   bNumberConfigurations As Byte
   fill(128) As Byte
End Type

Public Type BulkTransferControlType
   lPipeNum As Long
End Type
////////////////////////////////////
////////////////////////////////////
Public Enum USBDPipeEnum
   eUsbdPipeTypeControl = 0
   eUsbdPipeTypeIsochronous
   eUsbdPipeTypeBulk
   eUsbdPipeTypeInterrupt
End Enum
////////////////////////////////////
////////////////////////////////////
Public Type USBDPipeInformationType

   iMaximumPacketSize As Integer
   bEndpointAddress As Byte    
                                
   bInterval As Byte            
  
   PipeType As USBDPipeEnum    
   lPipeHandle As Long

   lMaximumTransferSize As Long  
                                
   lPipeFlags As Long
End Type

////////////////////////////////////
////////////////////////////////////
Public Type USBDInterfaceInformationType
   iLength As Integer  

   bInterfaceNumber As Byte
   bAlternateSetting As Byte

   bClass As Byte
   bSubClass As Byte
   bProtocol As Byte
   bReserved As Byte
  
   lInterfaceHandle As Long
   lNumberOfPipes As Long

   Pipes(MAX_PIPES) As USBDPipeInformationType
End Type

////////////////////////////////////
////////////////////////////////////
Function DoBulkXfer(strDriver As String, pipe As Integer, ByRef buffer() As Byte, ByRef dataLen As Long) As Long

Dim hDriverHandle As Long
Dim result As Long
Dim btc As BulkTransferControlType
Dim pi As USBDInterfaceInformationType
Dim usbDD As USBDeviceDescriptorType
Dim lBytesReturned As Long

hDriverHandle = OpenDriver(strDriver)
\'
If hDriverHandle > 0 Then

   result = DeviceIoControl(hDriverHandle, IOCTL_Ezusb_GET_DEVICE_DESCRIPTOR, usbDD, Len(usbDD), usbDD, Len(usbDD), lBytesReturned, 0)
  
   If result = 0 Then: DoBulkXfer = result
  
   If usbDD.iVendorID <> &H547 And usbDD.iProductID <> &H1002 Then
       DoBulkXfer = eBadPipe
       Exit Function
   End If
  
   result = GetPipeInfo(strDriver, pi)
  
   If result = 0 Then
       DoBulkXfer = result
       Exit Function
   End If

   If pi.lNumberOfPipes <= pipe Then
       DoBulkXfer = eBadPipe
       Exit Function
   Else
       btc.lPipeNum = pipe
   End If

   If (pi.Pipes(pipe).bEndpointAddress > 128) Then
       result = DeviceIoControl(hDriverHandle, IOCTL_EZUSB_BULK_READ, btc, Len(btc), buffer(0), dataLen, dataLen, 0)
   Else
       result = DeviceIoControl(hDriverHandle, IOCTL_EZUSB_BULK_WRITE, btc, Len(btc), buffer(0), dataLen, dataLen, 0)
   End If

   CloseHandle (hDriverHandle)
  
   DoBulkXfer = result
  
Else

   DoBulkXfer = eBadDriver

End If

End Function

////////////////////////////////////
////////////////////////////////////
Function GetPipeInfo(strDriver As String, pi As USBDInterfaceInformationType) As Long

Dim result As Long
Dim hDriverHandle As Long
Dim lBytesReturned As Long

hDriverHandle = OpenDriver(strDriver)

GetPipeInfo = 0

If hDriverHandle > 0 Then

   result = DeviceIoControl(hDriverHandle, IOCTL_Ezusb_GET_PIPE_INFO, pi, Len(pi), pi, Len(pi), lBytesReturned, 0)
   CloseHandle (hDriverHandle)
End If

GetPipeInfo = result

End Function

////////////////////////////////////
////////////////////////////////////
Function OpenDriver(sDriverName As String) As Long

Dim result As Long
Dim driverName As String

driverName = \"\\\\.\\\" & sDriverName

result = CreateFile(driverName, (GENERIC_READ Or GENERIC_WRITE), (FILE_SHARE_READ Or FILE_SHARE_WRITE), ByVal 0, OPEN_EXISTING, 0&, 0)

If result < 0 Then
   result = GetLastError()
End If
OpenDriver = result

End Function

////////////////////////////////////
////////////////////////////////////
Sub ErrMsg(err As ErrorEnum)
  
Select Case err
      
   Case eBadDriver
       MsgBox \"Selected EZ-USB Device Driver was not found. Perhaps no device is connected.\", vbOKOnly + vbCritical, \"BulkXFer Error\"
   Case eBadPipe
       MsgBox \"Correct Pipe not found. Perhaps \"\"Ep-pair.hex\"\" was not downloaded to a development board.\", vbOKOnly + vbCritical, \"BulkXFer Error\"
   Case Else
       MsgBox \"Unknown Error.\", vbOKOnly + vbCritical, \"BulkXFer Error\"
End Select

End Sub

///////////////////////////////////
\'下面这些是在FRM里面摘出来的文件
///////////////////////////////////

Attribute VB_Name = \"frmBulk\"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = True
Attribute VB_Exposed = False

Option Explicit

Public strBuffer As String

////////////////////////////////////
////////////////////////////////////
Private Sub Form_Load()
Dim Index As Integer
Dim sDriverName As String
Dim hDriver As Long

   For Index = 0 To MAX_USB_DEV_NUMBER - 1
       sDriverName = \"Ezusb-\" & Index
       hDriver = OpenDriver(sDriverName)
       If hDriver > 0 Then
           cmbDriverName.AddItem sDriverName
           CloseHandle hDriver
       End If
   Next
  
   If cmbDriverName.ListCount > 0 Then
       cmbDriverName.Text = cmbDriverName.List(0)
   Else
       ErrMsg (eBadDriver)
       End
   End If
End Sub

////////////////////////////////////
////////////////////////////////////
Private Sub txtIn_Change()

   Dim buffer(63) As Byte
   Dim result As Long
   Dim i As Integer
   Dim lDataLen As Long
   Dim sDriverName As String

   strBuffer = strBuffer + Right(txtIn, 1)

   If Len(strBuffer) = Val(txtBlkSize.Text) Then

       lDataLen = Len(strBuffer)
       For i = 1 To lDataLen
           buffer(i - 1) = Asc(Mid(strBuffer, i, 1))
       Next
       strBuffer = \"\"
      
       sDriverName = cmbDriverName.Text

       result = DoBulkXfer(sDriverName, eWrite, buffer, lDataLen)
       If result <> 1 Then: ErrMsg (result): Exit Sub

       For i = 0 To 63 \' no rabbits up my sleeve
           buffer(i) = 0
       Next

       result = DoBulkXfer(sDriverName, eRead, buffer, lDataLen)
       If result <> 1 Then: ErrMsg (result): Exit Sub

       For i = 1 To lDataLen
           txtOut.Text = txtOut.Text + Chr(buffer(i - 1))
       Next
      
   End If \' xfer trigger reached
  
End Sub

////////////////////////////////////
////////////////////////////////////
Private Sub txtBlkSize_Change()
Dim temp As Integer

   temp = Val(txtBlkSize)
  
   If temp < 0 Or temp > 64 Then
       MsgBox \"Enter a valid Bulk Transfer block size between 1 and 64.\", vbInformation, \"Input Error\"
       txtBlkSize.SelStart = 0
       txtBlkSize.SelLength = 3
   End If
End Sub

Private Sub cmdClearIn_Click()
   txtIn.Text = \"\"
End Sub

Private Sub cmdClearOut_Click()
   txtOut.Text = \"\"
End Sub

Private Sub Form_Activate()
   txtBlkSize.SetFocus
End Sub  

这是CY提供的,如果找到AN2131,他就可以运行,如果找不到,就提示出错然后退出。我看了一下,也将opendriver翻译成delphi了,可是我还是不懂,有那些重要的请各位朋友帮帮我。
usb_anywhere
驱动小牛
驱动小牛
  • 注册日期2003-07-29
  • 最后登录2005-11-22
  • 粉丝0
  • 关注0
  • 积分3分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2003-09-17 19:04
其实用什么语言编写上层都是一样的,假如你把你的VB程序读董的化,应该没有什么问题。
你的程序里的名称怎么得到的,你就怎么得到设备名呗

其实不管用什么编写,无非也就是以下几步:
1)获取设备信息集
2)获取设备
3)获取接口信息
这些你都得到了,上面那个问题还有吗?
驱网是你们的,也是我们的,归根结底还是大家的!
kimlon
驱动牛犊
驱动牛犊
  • 注册日期2003-05-21
  • 最后登录2010-03-07
  • 粉丝0
  • 关注0
  • 积分17分
  • 威望3点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2003-09-18 08:24
1) CreateFile(\\\\.\\EZUSB-0,
GENERIC_READ, FILE_SHARE_READ,
NULL, OPEN_EXISTING, 0, NULL);

我现在用createfile可以找开一个EZUSB,但是我不知道要如何控制他,看例程有一个DriverIoControl的API函数,请问这个是在做什么的呢?
kimlon
驱动牛犊
驱动牛犊
  • 注册日期2003-05-21
  • 最后登录2010-03-07
  • 粉丝0
  • 关注0
  • 积分17分
  • 威望3点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2003-09-18 08:26
请问那位朋友可以帮我把这一段翻译成delphi

////////////////////////////////////
Function DoBulkXfer(strDriver As String, pipe As Integer, ByRef buffer() As Byte, ByRef dataLen As Long) As Long

Dim hDriverHandle As Long
Dim result As Long
Dim btc As BulkTransferControlType
Dim pi As USBDInterfaceInformationType
Dim usbDD As USBDeviceDescriptorType
Dim lBytesReturned As Long

hDriverHandle = OpenDriver(strDriver)
\'
If hDriverHandle > 0 Then

result = DeviceIoControl(hDriverHandle, IOCTL_Ezusb_GET_DEVICE_DESCRIPTOR, usbDD, Len(usbDD), usbDD, Len(usbDD), lBytesReturned, 0)

If result = 0 Then: DoBulkXfer = result

If usbDD.iVendorID <> &H547 And usbDD.iProductID <> &H1002 Then
DoBulkXfer = eBadPipe
Exit Function
End If

result = GetPipeInfo(strDriver, pi)

If result = 0 Then
DoBulkXfer = result
Exit Function
End If

If pi.lNumberOfPipes <= pipe Then
DoBulkXfer = eBadPipe
Exit Function
Else
btc.lPipeNum = pipe
End If

If (pi.Pipes(pipe).bEndpointAddress > 128) Then
result = DeviceIoControl(hDriverHandle, IOCTL_EZUSB_BULK_READ, btc, Len(btc), buffer(0), dataLen, dataLen, 0)
Else
result = DeviceIoControl(hDriverHandle, IOCTL_EZUSB_BULK_WRITE, btc, Len(btc), buffer(0), dataLen, dataLen, 0)
End If

CloseHandle (hDriverHandle)

DoBulkXfer = result

Else

DoBulkXfer = eBadDriver

End If

End Function

////////////////////////////////////
usb_anywhere
驱动小牛
驱动小牛
  • 注册日期2003-07-29
  • 最后登录2005-11-22
  • 粉丝0
  • 关注0
  • 积分3分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2003-09-22 14:55
我现在正在将我的VC代码翻译成delphi
其实编程序和用什么语言无关,只要你明白了它的道理
都是一样的
驱网是你们的,也是我们的,归根结底还是大家的!
usb_anywhere
驱动小牛
驱动小牛
  • 注册日期2003-07-29
  • 最后登录2005-11-22
  • 粉丝0
  • 关注0
  • 积分3分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2003-09-22 16:00
你连creatfile函数都不会用,你还是休息吧
驱网是你们的,也是我们的,归根结底还是大家的!
kimlon
驱动牛犊
驱动牛犊
  • 注册日期2003-05-21
  • 最后登录2010-03-07
  • 粉丝0
  • 关注0
  • 积分17分
  • 威望3点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2003-09-23 08:26
我用CreateFile这个函数已经可以找到USB设备了,只是用= DeviceIoControl和其它一些VB的语法我不知道要如何翻译成DELPHI呀。你从VC翻译成DELPHI的工作做好了没有,能不能将DELPHI的代码给我学习呀,(只要一小段关于如何通信和如何读写就行了,)

感激不尽。 kimlon@163.com
usb_anywhere
驱动小牛
驱动小牛
  • 注册日期2003-07-29
  • 最后登录2005-11-22
  • 粉丝0
  • 关注0
  • 积分3分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2003-09-23 09:34
好的
等着
驱网是你们的,也是我们的,归根结底还是大家的!
kimlon
驱动牛犊
驱动牛犊
  • 注册日期2003-05-21
  • 最后登录2010-03-07
  • 粉丝0
  • 关注0
  • 积分17分
  • 威望3点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2003-09-23 11:11
谢谢
NewTech
驱动大牛
驱动大牛
  • 注册日期2002-10-02
  • 最后登录2010-03-27
  • 粉丝0
  • 关注0
  • 积分16分
  • 威望263点
  • 贡献值0点
  • 好评度86点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2003-09-23 11:45
可否也发一份给我!谢谢!newtech2000@163.com
游客

返回顶部