Programming/C Win32 MFC2017. 10. 25. 16:36

대부분의 툴들이..

USB 시리얼 뽑으면 먹통이 되는 경우가 많은데

그거 해결용으로 검색중..


[링크 : https://stackoverflow.com/.../identify-disconnect-event-with-a-windows-usb-virtual-com-port]


FTDI의 경우에는 이렇게 보내는 주는 듯?

class CAboutDlg : public CDialog

{

void CD2XXNotifyDlg::OnPaint();

BOOL CD2XXNotifyDlg::OnDeviceChange(UINT EventType, DWORD dwData);

protected:

DECLARE_MESSAGE_MAP()

};

void CAboutDlg::DoDataExchange(CDataExchange* pDX){}

BEGIN_MESSAGE_MAP(CD2XXNotifyDlg, CDialog)

ON_WM_PAINT()

ON_WM_DEVICECHANGE()

END_MESSAGE_MAP()

void CD2XXNotifyDlg::OnPaint()

{}

BOOL CD2XXNotifyDlg::OnDeviceChange(UINT EventType, DWORD dwData) {}

[링크 : http://www.ftdichip.com/.../AN_152_Detecting_USB_%20Device_Insertion_and_Removal.pdf]



MFC 클래스 위저드에는 WM_DEVICECHANGE가 없는데 afxmsg.h 에는 존재한다.

#define ON_WM_DEVICECHANGE() \

{ WM_DEVICECHANGE, 0, 0, 0, AfxSig_bwl, \

(AFX_PMSG)(AFX_PMSGW) \

(static_cast< BOOL (AFX_MSG_CALL CWnd::*)(UINT, DWORD_PTR) > ( &ThisClass :: OnDeviceChange)) }, 


    case WM_DEVICECHANGE:
    {
        //
        // This is the actual message from the interface via Windows messaging.
        // This code includes some additional decoding for this particular device type
        // and some common validation checks.
        //
        // Note that not all devices utilize these optional parameters in the same
        // way. Refer to the extended information for your particular device type 
        // specified by your GUID.
        //
        PDEV_BROADCAST_DEVICEINTERFACE b = (PDEV_BROADCAST_DEVICEINTERFACE) lParam;
        TCHAR strBuff[256];

        // Output some messages to the window.
        switch (wParam)
        {
        case DBT_DEVICEARRIVAL:
            msgCount++;
            StringCchPrintf(
                strBuff, 256, 
                TEXT("Message %d: DBT_DEVICEARRIVAL\n"), msgCount);
            break;
        case DBT_DEVICEREMOVECOMPLETE:
            msgCount++;
            StringCchPrintf(
                strBuff, 256, 
                TEXT("Message %d: DBT_DEVICEREMOVECOMPLETE\n"), msgCount);
            break;
        case DBT_DEVNODES_CHANGED:
            msgCount++;
            StringCchPrintf(
                strBuff, 256, 
                TEXT("Message %d: DBT_DEVNODES_CHANGED\n"), msgCount);
            break;
        default:
            msgCount++;
            StringCchPrintf(
                strBuff, 256, 
                TEXT("Message %d: WM_DEVICECHANGE message received, value %d unhandled.\n"), 
                msgCount, wParam);
            break;
        }
        OutputMessage(hEditWnd, wParam, (LPARAM)strBuff); 

} 

[링크 : https://msdn.microsoft.com/en-us/library/windows/desktop/aa363432(v=vs.85).aspx]


뽑으면 0x0007->0x8004 순서로 발생하고

꼽으면 0x0007->0x0007->0x8000->0x0007 으로 발생한다.

(근데 뽑는건 꼽는거에 비해서 반응이 많이 느리거나 안될때도 있음)

DBT_DEVNODES_CHANGED 0x0007

DBT_DEVICEARRIVAL 0x8000

DBT_DEVICEREMOVECOMPLETE 0x8004 

[링크 : https://msdn.microsoft.com/en-us/library/windows/desktop/aa363480(v=vs.85).aspx]


+

여긴 일단 .net 쪽

[링크 : https://stackoverflow.com/.../usb-serial-port-unplugged-but-still-in-the-list-of-ports]

[링크 : https://stackoverflow.com/.../com-port-disappears-when-unplugging-usb]

'Programming > C Win32 MFC' 카테고리의 다른 글

CEdit 내용 지우기와 메모리 사용량  (0) 2017.10.26
CEdit 길이 제한  (0) 2017.10.26
MFC 다이얼로그에 웹브라우저 넣기  (0) 2017.10.24
한글 코드 페이지  (0) 2017.10.23
CSliderCtrl OnHScroll() 주의사항  (0) 2017.10.20
Posted by 구차니