在移动设备上进行串行通信时,确保在系统挂起和恢复后自动重新连接至串行端口是一个常见的需求。本文将探讨如何在Windows Mobile设备上实现这一功能,特别是在设备提供通信端口且在挂起期间不关闭端口的情况下。
在某些情况下,设备在挂起/恢复后不会自动重新连接,用户必须手动触发主窗口并选择文件-隐藏,以便KeyWedge重新连接。为了解决这个问题,添加了一些代码来监控Windows Mobile电源消息队列中的恢复消息,并自动重新连接。另一种选择是定期通过端口发送一些数据来检查它是否仍然工作,但这可能会干扰连接的设备。
主要的更改位于PowerMsgQueue.cpp
文件中。它实现了消息队列以接收电源广播消息,类似于MSDN示例代码中的做法。如果遇到恢复消息,代码会向主窗口发送一个WM_USER
消息,该消息将执行SuspendComm
/ResumeComm
循环。非常简单。
在PowerMsgQueue.cpp
中,有识别恢复的代码:
case PBT_TRANSITION:
nclog(L"Power Notification Message: PBT_TRANSITION\n");
nclog(L"Flags: %lx\n", ppb->Flags);
nclog(L"Length: %d\n", ppb->Length);
if (ppb->Flags & 0x12010000) {
nclog(L"PwrMsgQueue: got 'ON|PASSWORD|BACKLIGHTON'...\n");
iPost = PostMessage(hwndMain, WM_USER_RESUMECOMM, 0, 0);
nclog(L"PostMessage WM_USER_RESUMECOMM returned %i\n", iPost);
}
break;
case PBT_RESUME:
nclog(L"Power Notification Message: PBT_RESUME\n");
iPost = PostMessage(hwndMain, WM_USER_RESUMECOMM, 0, 0);
nclog(L"PostMessage WM_USER_RESUMECOMM returned %i\n", iPost);
nclog(L"Power: PBT_RESUME\n");
break;
为了避免阻塞队列,使用PostMessage
来通知主窗口恢复。以下是主窗口WndProc
中的简单代码块:
case WM_USER_RESUMECOMM:
nclog(L"WndProc: received WM_USER_RESUMECOMM: restarting COMM\n");
suspendCOMM();
Sleep(100);
resumeCOMM();
break;
msgQueue
线程是在主窗口的InitInstance
中创建的:
//create PowerResume watchdog thread
hwndMain=hWnd;
if (startMsgThread()==0)
nclog(L"InitInstance: startMsgThread() OK\r\n");
else
nclog(L"InitInstance: startMsgThread() FAILED\r\n");
ShowWindow(hWnd, SW_HIDE);
UpdateWindow(hWnd);