标题: 蓝牙虚拟串口, 注册服务失败
void CBlueTestDlg::OnBnClickedButton1()
{
// 注册服务
PORTEMUPortParams pp ;
ZeroMemory(&pp, sizeof(pp));
pp.channel = RFCOMM_CHANNEL_MULTIPLE ;// the next available channel
pp.flocal = TRUE;
GetBA(_T("000b244ada77"), &pp.device);
int nIndex = 1;
HANDLE m_hDev = RegisterDevice(_T("COM"), nIndex, _T("btd.dll"), (DWORD)&pp);
//这里会返回错误, 错误代码为2404, 意思为" 设备正由活动进程使用,无法断开。"
CString sErr ;
sErr.Format(_T("Error %d,RegisterDevice!"), GetLastError()) ;
if (m_hDev == 0)
{
MessageBox(sErr, _T("ERROR")) ;
}
}
可是我看网上的类似代码,都说这里会成功,不知什么原因,请各位大大指点一下!
------解决方案--------------------
改变nIndex值,尝试其他的
------解决方案--------------------
通过虚拟串口连接蓝牙设备需要3个条件:
1.被连接设备的地址;
2.被连接设备提供的连接通道;
3.本机的一个虚拟COM;
就我自己在这方面的经验来说,第二个条件最难得到。看了楼主自己的做法以及你提到的别人的做法,这个连接通道,都是直接指定的,这个,我不敢说有什么问题,但是至少我这样做,没有成功过。
如果有兴趣,你可以做这样一个测试:获取设备地址之后,注册虚拟端口时,循环测试通道和COM口的每一种组合。因为,连接通道是在1-31之间的,而虚拟COM口,也就在0-9之间(实际上,我用的几款多谱达的手机,只支持COM6和COM7)。这样下来,组合情况也没多少:
PORTEMUPortParams pp;
memset(&pp,0,sizeof(pp));
pp.device = btAddr;
pp.uiportflags = RFCOMM_PORT_FLAGS_REMOTE_DCB;
for(int m = 1;m <= 31;m++)
{
pp.channel = m & 0xFF;
BOOL bSuccess = FALSE;
for(int n = 0; n <= 9; n++)
{
hDev = RegisterDevice(_T("COM"),n,_T("btd.dll"),(DWORD)&pp);
if(hDev )
{
bSuccess = TRUE;
BREAK;
}
}
if(bSuccess )
break;
}
看看能否注册成功。