線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:3201
推到 Plurk!
推到 Facebook!

Usb interrupt pipe

答題得分者是:taishyang
waterful0
一般會員


發表:7
回覆:12
積分:3
註冊:2006-07-12

發送簡訊給我
#1 引用回覆 回覆 發表時間:2009-03-25 15:05:37 IP:219.87.xxx.xxx 訂閱
麻煩知道的人指點一下小弟,謝謝。
問題如下:


我想要透過interrup pipe 在STI 下收到scanner 的 給我的訊息。
我的做法如下:


// Endpoint list:///////////////////////////////////////////////////////////////////////////////////////

//bulk in
00000003 0.00096549 [660] MaximumPacketSize =512
00000004 0.00103002 [660] EndpointAddress =0x82
00000005 0.00106997 [660] Interval =0
00000006 0.00219497 [660] PipeType = USBSCAN_PIPE_BULK

//bulk out
00000007 0.00227403 [660] MaximumPacketSize =512
00000008 0.00231482 [660] EndpointAddress =0x02
00000009 0.00273750 [660] Interval =0
00000010 0.00279840 [660] PipeType = USBSCAN_PIPE_BULK

//interrupt in
00000011 0.00284031 [660] MaximumPacketSize =8
00000012 0.00344792 [660] EndpointAddress =0x87
00000013 0.00351553 [660] Interval =11
00000014 0.00355604 [660] PipeType = USBSCAN_PIPE_INTERRUPT

//interrupt
00000015 0.00406253 [660] MaximumPacketSize =8
00000016 0.00413293 [660] EndpointAddress =0x07
00000017 0.00430837 [660] Interval =11
00000018 0.00497298 [660] PipeType = USBSCAN_PIPE_INTERRUPT

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

//code
typedef struct _MY_EVENT_DATA
{
BYTE byTag[8];
}MY_EVENT_DATA, *PMY_EVENT_DATA;


class UsdMyDevice : public IStiUSD, public INonDelegatingUnknown
{
privater:
MY_EVENT_DATA m_EventData;
OVERLAPPED m_EventOverlapped;
...
}

STDMETHODIMP UsdMyDevice::Initialize()
{
...
//default pipe================================================
m_DeviceDataHandle = CreateFileA( m_pszDeviceNameA,
GENERIC_READ | GENERIC_WRITE, // Access mask
FILE_SHARE_READ | FILE_SHARE_WRITE, // Share mode
NULL, // SA
OPEN_EXISTING, // Create disposition
FILE_ATTRIBUTE_SYSTEM, // Attributes
NULL );

//interrupt pipe================================================
char szDeviceName[MAX_PATH];
sprintf(szDeviceName,"%s\\2", m_pszDeviceNameA);
m_hDeviceInt = CreateFile( szDeviceName,
GENERIC_READ, //GENERIC_READ | GENERIC_WRITE, // Access mask
0, // Share mode
NULL, // SA
OPEN_EXISTING, // Create disposition
FILE_FLAG_OVERLAPPED, // Attributes
NULL );


...
}



STDMETHODIMP UsdMyDevice:: SetNotificationHandle( HANDLE hEvent )
{
HRESULT hr = S_OK;

if (hEvent && (hEvent != INVALID_HANDLE_VALUE))
{

m_guidLastEvent = GUID_NULL;
memset(&m_EventOverlapped,0,sizeof(m_EventOverlapped));
m_EventOverlapped.hEvent = hEvent;
memset(&m_EventData, 0, sizeof(MY_EVENT_DATA));

//
// use the following call for interrupt events on your device
//
DWORD dwError = 0;
::DebugOutputA("***FITUSD*** SetNotificationHandle: DeviceIoControl In");
BOOL bResult = DeviceIoControl( m_hDeviceInt,
(DWORD)IOCTL_WAIT_ON_DEVICE_EVENT,
NULL,
0,
&m_EventData,
sizeof(m_EventData),
&dwError,
&m_EventOverlapped );

if (bResult)
{
hr = S_OK;
} else
{
hr = HRESULT_FROM_WIN32(::GetLastError());
}

} else
{

if(m_hDeviceInt)
{
if(!CancelIo(m_hDeviceInt))
{
//
// canceling of the IO failed, call GetLastError() here to determine the cause.
//
LONG lError = ::GetLastError();
}
}

}
return hr;

}


STDMETHODIMP UsdMyDevice::GetNotificationData( LPSTINOTIFY pBuffer )
// SYNCHRONIZED
{
//應該要進來,卻沒進來
..
}




系統呼叫 SetNotificationHandle 後,出現0x800703E5 (重疊I/O正在進行中) 的錯誤,沒有再呼叫 GetNotificationData。
為什麼?是我的Createfile 錯了嗎?還是DeviceIoControl 錯誤?
taishyang
站務副站長


發表:377
回覆:5485
積分:4552
註冊:2002-10-08

發送簡訊給我
#2 引用回覆 回覆 發表時間:2009-03-26 14:01:24 IP:118.169.xxx.xxx 訂閱
先用USB分析儀 or BusHound看看資料有沒有送出去
waterful0
一般會員


發表:7
回覆:12
積分:3
註冊:2006-07-12

發送簡訊給我
#3 引用回覆 回覆 發表時間:2009-03-26 18:00:20 IP:122.146.xxx.xxx 訂閱
已測,data 是有上來的。F/W 確實有發給我。
問題應該是我在呼叫OS 的API 這一層,我懷疑方法有錯,可是又不知道錯在哪?
taishyang
站務副站長


發表:377
回覆:5485
積分:4552
註冊:2002-10-08

發送簡訊給我
#4 引用回覆 回覆 發表時間:2009-03-26 18:29:39 IP:118.169.xxx.xxx 訂閱
看看CreateFile回傳的handle是否OK
若OK,看看DeviceIoControl的回傳值是什麼
waterful0
一般會員


發表:7
回覆:12
積分:3
註冊:2006-07-12

發送簡訊給我
#5 引用回覆 回覆 發表時間:2009-03-26 18:54:24 IP:122.146.xxx.xxx 訂閱
CreateFile 回傳值ok
DeviceIoControl 回傳值為 0 (失敗),GetLastError= 0x800703E5(重疊I/O正在進行中)
taishyang
站務副站長


發表:377
回覆:5485
積分:4552
註冊:2002-10-08

發送簡訊給我
#6 引用回覆 回覆 發表時間:2009-03-26 19:26:34 IP:118.169.xxx.xxx 訂閱
help中說到
If the overlapped operation cannot be completed immediately,
the function returns FALSE, and GetLastError returns ERROR_IO_PENDING,
indicating that the operation is executing in the background.

表示你的device資料還沒有回傳
建議先不要用Overlap的方式收資料
waterful0
一般會員


發表:7
回覆:12
積分:3
註冊:2006-07-12

發送簡訊給我
#7 引用回覆 回覆 發表時間:2009-03-27 11:20:44 IP:122.146.xxx.xxx 訂閱
如果沒有使用Overlap 的話,會一直 hang 著,無法返回...
taishyang
站務副站長


發表:377
回覆:5485
積分:4552
註冊:2002-10-08

發送簡訊給我
#8 引用回覆 回覆 發表時間:2009-03-27 11:24:16 IP:118.169.xxx.xxx 訂閱
這就表示device的資料沒有傳到PC端
你不是有用分析儀(CATC or bushound...)看嗎?

===================引 用 waterful0 文 章===================
如果沒有使用Overlap 的話,會一直 hang 著,無法返回...
waterful0
一般會員


發表:7
回覆:12
積分:3
註冊:2006-07-12

發送簡訊給我
#9 引用回覆 回覆 發表時間:2009-03-27 11:55:10 IP:60.244.xxx.xxx 訂閱
恩,這就是問題點了,所以我懷疑是我的pipe 是否開錯了。
F/W : endpoint 0x87 (interrupt in)
我 : 我不知道CreateFile 幫我打開的是endpoint 多少?

有辨法可以看出CreateFile 打開的是哪個endpoint 嗎?
taishyang
站務副站長


發表:377
回覆:5485
積分:4552
註冊:2002-10-08

發送簡訊給我
#10 引用回覆 回覆 發表時間:2009-03-27 12:21:09 IP:118.169.xxx.xxx 訂閱
Driver是自己開發的嗎?
CreateFile中用到的Symbolic name通常會加上PIPE名稱讓driver區分你要取得的是哪一個endpoint的handle


===================引 用 waterful0 文 章===================
恩,這就是問題點了,所以我懷疑是我的pipe 是否開錯了。
F/W : endpoint 0x87 (interrupt in)
我 : 我不知道CreateFile 幫我打開的是endpoint 多少?

有辨法可以看出CreateFile 打開的是哪個endpoint 嗎?
waterful0
一般會員


發表:7
回覆:12
積分:3
註冊:2006-07-12

發送簡訊給我
#11 引用回覆 回覆 發表時間:2009-03-30 17:37:16 IP:60.244.xxx.xxx 訂閱
driver 是用windows 的usbscan.sys
感謝您的回答,F/W 現在那邊似乎有些問題,所以我得親自check 一下到底資料有沒有上來。
再次感謝您的幫助。
系統時間:2017-10-20 11:39:57
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!