請問如何確定PIPE NAME? |
尚未結案
|
jewelz03
一般會員 發表:1 回覆:1 積分:0 註冊:2012-06-14 發送簡訊給我 |
各位大大好
不好意思 事先我已經有爬過文了 但我仍然不是很懂有關windows下有關USB PIPE NAME的問題 目前我手邊有一塊USB Composite Device 我想要對它做普通讀寫的動作 目前我的問題點出在 我已經取得裝置的Path 並引用到CreateFile下去取得裝置的handle 但在Read.Write時取得error87,我認為應該是handle的問題 之後有讀過Mass Storage Class是要對Endpoint做Read.Write 所以必須在USB Path後面再加上"// PIPExx" 之後再用CreateFile取得正確的handle 但由於書上或網路都沒有對PIPE Name有詳細的說明 有書上通稱PIPE Name就是"PIPE" 請問這樣對嗎? 而我有用Bus Hound去看過裝置的Interface Descriptor說有3個Endpoint 分別如下: Endpoint 0: Type=CTL Class=08 SubClass=06 Protocol=50 MaxPacket=8 Endpoint 2 OUT: Type=BULK Class=08 SubClass=06 Protocol=50 MaxPacket=40 Endpoint 1 IN: Type=BULK Class=08 SubClass=06 Protocol=50 MaxPacket=40 我想問的是 那我要加在PATH後面的PIPE Name 是否就是device.path "//PIPE01" 取得handle 用在ReadFile() 而device.path "//PIPE02" 取得handle用在WriteFile()呢? 如果真是如此 其實我也已經試過 得到的結果也是Error87 所以我想請教一下 PIPE Name是否真是如此?? 如果真確 那我又是哪裡不正確呢? 以下是我的原始碼: using System.Collections.Generic; using System.Data; using System.Linq; using System.Windows.Forms; using Microsoft.Win32.SafeHandles; using System.IO.Ports; public class Form { public string Mass_Storage_GUID = //USB Interface Guid const internal Int32 DIGCF_DEVICEINTERFACE = 0x10; SafeFileHandle deviceHandle; SetupAPI.new devInfo(); void button1_Click(EventArgs e) { System.new System.IntPtr deviceInfoSet; deviceInfoSet = ref myGuid,IntPtr.Zero,DIGCF_PRSENT|DIGCF_DEVICEINTERFACE); SetupAPI.new SP_Devcie_INTERFACE_DATA(); false; ""; MyDeviceInterfaceData.cbSize = do { success = IntPtr.Zero, ref MyDeviceInterfaceData); IntPtr detailDataBuffer; false; success2 = ref MyDeviceInterfaceData, ref bufferSize, Marshal.AllocHGlobal(bufferSize); IntPtr.Size == 4) ? (4 SetupAPI.SetupDiGetDeviceInterfaceDetail(deviceInfoSet, ref bufferSize, IntPtr pDevicepathName = IntPtr(detailDataBuffer.ToInt32() 4); devicePathName = Marshal.FreeHGlobal(detailDataBuffer); memberIndex ; } "\\\\?\\usb#vid_0402&pid_5668#00101000100000000436#{a5dcbf10-6530-11d2-901f-00c04fb951ed}");//因為先前已得知裝置路徑 //SetupAPI.SetupDiDestroyDeviceInfoList(deviceInfoSet); SafeFileHandle DeviceHandle; "//PIPE2"; SetupAPI.CreateFile(devicePathName, SetupAPI.GENERIC_WRITE, SetupAPI.FILE_SHARE_WRITE, SetupAPI.OPEN_EXISTING, 0, 0); SetupAPI.WinUsb_Initialize(DeviceHandle,int r = Byte[] buffer = Byte[13]; Byte[] Write_buffer = { 0x55, 0x53, 0x42, 0x43, 0xd0, 0xba, 0x5e, 0x86, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; false; SetupAPI.WriteFile(DeviceHandle, Write_buffer, Write_buffer.Length, IntPtr.Zero); Marshal.GetLastWin32Error();while (success3 == int j = MessageBox.Show(j.ToString()); success3 = ref i,int q = MessageBox.Show(q.ToString()); } } } 編輯記錄
jewelz03 重新編輯於 2012-06-14 04:07:44, 註解 無‧
|
taishyang
站務副站長 發表:377 回覆:5490 積分:4563 註冊:2002-10-08 發送簡訊給我 |
|
jewelz03
一般會員 發表:1 回覆:1 積分:0 註冊:2012-06-14 發送簡訊給我 |
謝謝大大指教
而我剛剛試過 結果依舊是Error87 以下是我用usbview看的結果 Device Descriptor: bcdUSB: 0x0200 bDeviceClass: 0x00 bDeviceSubClass: 0x00 bDeviceProtocol: 0x00 bMaxPacketSize0: 0x40 (64) idVendor: 0x0402 (Acer Labs Inc.) idProduct: 0x5668 bcdDevice: 0x0002 iManufacturer: 0x03 iProduct: 0x01 iSerialNumber: 0x02 bNumConfigurations: 0x01 ConnectionStatus: DeviceConnected Current Config Value: 0x01 Device Bus Speed: Full Device Address: 0x02 Open Pipes: 2 Endpoint Descriptor: bEndpointAddress: 0x81 Transfer Type: Bulk wMaxPacketSize: 0x0200 (512) bInterval: 0x00 Endpoint Descriptor: bEndpointAddress: 0x02 Transfer Type: Bulk wMaxPacketSize: 0x0200 (512) bInterval: 0x00 不知道有沒有幫助 我知道看bEndpointAddress的0-3bit就是pipe number 所以照常理來講寫入就是PIPE02 讀取就是PIPE01 應該也沒錯才對吧?! 另外想請問一下 如果我改用DeviceIoControl()去讀寫 是否也要取得PIPE的handle呢?? |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |