阅读:1902回复:12
请指导我一下,高级语言跟USB通信的一般步骤。
USB的芯片是CY AN2131。
编程语言是DELPHI。 我看了CY的开发组件,他是用C和VB写的。 好像也是用到API函数来打开USB的,那位朋友可以跟我说一下, 要跟USB通信的一些基本步骤。 比如:1,用createfile(xxx,......) 2,.... 如果方便请将VB或C的例程贴出来,非常感谢。 |
|
最新喜欢:![]() |
沙发#
发布于: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); |
|
|
板凳#
发布于:2003-09-16 16:48
可是用CreateFile要有一个名称的,如串口1为 \'com1\'
那USB用什么名称呀??? 我有VB的程序,那位朋友可以帮我转为delphi么? |
|
地板#
发布于: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了,可是我还是不懂,有那些重要的请各位朋友帮帮我。 |
|
地下室#
发布于:2003-09-17 19:04
其实用什么语言编写上层都是一样的,假如你把你的VB程序读董的化,应该没有什么问题。
你的程序里的名称怎么得到的,你就怎么得到设备名呗 其实不管用什么编写,无非也就是以下几步: 1)获取设备信息集 2)获取设备 3)获取接口信息 这些你都得到了,上面那个问题还有吗? |
|
|
5楼#
发布于:2003-09-18 08:24
1) CreateFile(\\\\.\\EZUSB-0,
GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL); 我现在用createfile可以找开一个EZUSB,但是我不知道要如何控制他,看例程有一个DriverIoControl的API函数,请问这个是在做什么的呢? |
|
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 //////////////////////////////////// |
|
7楼#
发布于:2003-09-22 14:55
我现在正在将我的VC代码翻译成delphi
其实编程序和用什么语言无关,只要你明白了它的道理 都是一样的 |
|
|
8楼#
发布于:2003-09-22 16:00
你连creatfile函数都不会用,你还是休息吧
|
|
|
9楼#
发布于:2003-09-23 08:26
我用CreateFile这个函数已经可以找到USB设备了,只是用= DeviceIoControl和其它一些VB的语法我不知道要如何翻译成DELPHI呀。你从VC翻译成DELPHI的工作做好了没有,能不能将DELPHI的代码给我学习呀,(只要一小段关于如何通信和如何读写就行了,)
感激不尽。 kimlon@163.com |
|
10楼#
发布于:2003-09-23 09:34
好的
等着 |
|
|
11楼#
发布于:2003-09-23 11:11
谢谢
|
|
12楼#
发布于:2003-09-23 11:45
可否也发一份给我!谢谢!newtech2000@163.com
|
|