首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > WinCE >

WINCE蓝牙错误时,refresh蓝牙模块还是不能正常工作

2013-01-04 
WINCE蓝牙异常时,refresh蓝牙模块还是不能正常工作问题:客户的蓝牙应用(C#)连接打印机多次打印0123456789

WINCE蓝牙异常时,refresh蓝牙模块还是不能正常工作
问题:
客户的蓝牙应用(C#)连接打印机多次打印0123456789的一位条码,在多次打印之后(我测试过在110,207次)无法正常打印,在出现这样的异常的时候(我今天复现过),这时候我用自己写的应用BTC.exe对蓝牙模块复位(也就是refresh=先下电+后上电),这时候通过串口信息可以看出下是成功的,但上电不成功,具体的体现在蓝牙驱动的BcspCommunication::OpenConnection()函数中出错,具体出错的地方如下:
serialPortHandle = CreateFile(portName, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
if (serialPortHandle == INVALID_HANDLE_VALUE)
{
        RETAILMSG(1, (TEXT("OpenConnection: %s ERROR!"), portName));
IFDBG(DebugOut(DEBUG_BCSP_ERROR, TEXT("<BcspCommunication::OpenConnection@%s> UNABLE TO OPEN PORT"), name));
return GetLastError();
}
CreateFile函数返回INVALID_HANDLE_VALUE,这样就导致了后面无法正常初始化(平时正常使用,在没有异常的情况下发生时,我应用程序BTC.exe是可以正常复位蓝牙模块的),现在的问题就是:为什么在蓝牙正常使用时,可以正常refresh,在异常时就发生上面的问题呢?

refresh蓝牙模块的代码如下:
BOOL bRet = FALSE;
WCHAR *argPtr = L"card";
 hService = CreateFile(L"BTD0:", GENERIC_READ | GENERIC_WRITE, 
FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL);

if(hService == INVALID_HANDLE_VALUE)
{
NKDbgPrintfW((TEXT("Device not loaded")));
return bRet;
}
if (DeviceIoControl(hService, IOCTL_SERVICE_REFRESH, argPtr, sizeof(WCHAR)*(wcslen (argPtr) + 1), NULL, 0, NULL, NULL))
{
bRet = TRUE;
NKDbgPrintfW(TEXT("RefreshBtService() refresh bt success\r\n"));
}
else
{
bRet = FALSE;
NKDbgPrintfW(TEXT("RefreshBtService() refresh bt fail\r\n"));
}
麻烦大家帮忙看看,此问题该怎么解决?先谢谢了。
[解决办法]
嵌入式的东西很麻烦,其实跟硬件打交道的都一样,usb驱动或者别的驱动Down掉,在Windows平台下除非重启或者把驱动删掉再重新扫描安装,很难原地再次激活它。。。
有高见的楼下请继续
[解决办法]

引用:
经过进一步调试发现,驱动BcspCommunication::OpenConnection()函数createfile获取的句柄,如下所示:
serialPortHandle = CreateFile(portName, GENERIC_READ 
[解决办法]
 GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
seria……


这样看来,你的蓝牙是工作正常的,只是发送命令的串口出错了,关注一下串口驱动
[解决办法]
建议你还是好好debug一下串口通讯那部分,仅仅恢复操作,治标不治本

做一个调试版本,抓抓log,看看出问题的时候,有什么规律
[解决办法]
你的蓝牙模块和CPU是什么接口的?有其他的无线模块比如WIFI吗?是否是硬件干扰引起的?
[解决办法]
蓝牙打印是用的什么协议,是不是直接发送数据就直接打印?

串口句柄变化了,可能是内存溢出,导致句柄值改变了。

另外 可以先测试下串口驱动有没有问题。
[解决办法]
引用:
引用:
期待楼主把解决问题的经验分享给大家~

如果解决了,肯定会分享的,我这里有个问题需要大家也帮忙确认一下,我的处理器是S3C2451的,串口驱动的ULONG CPdd2450Uart::GetModemStatus()函数中包含下面的代码:
 if (ubModemStatus &amp; (1<<2))
  Events 
[解决办法]
= EV_CTS;
根据2451串口……

呵呵,这是一个 C++ class 的问题。
在 CPdd2450Uart 定义的是有个虚函数,
在 CPdd2450Serial1 里面对这个函数重载了
所以,这里面的代码没任何意义~!

------解决方案--------------------


BcspCommunication::CloseConnection()我也觉得你是否是自己定义的类没有虚构函数,或者哪里没释放掉了,造成这个关闭不了了。你把整个代码发给我们吧,我们编译后在我们设备上测试一下。

热点排行