问题:
客户的蓝牙应用(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平台下除非重启或者把驱动删掉再重新扫描安装,很难原地再次激活它。。。
有高见的楼下请继续
------解决方案--------------------
这样看来,你的蓝牙是工作正常的,只是发送命令的串口出错了,关注一下串口驱动
------解决方案--------------------
建议你还是好好debug一下串口通讯那部分,仅仅恢复操作,治标不治本
做一个调试版本,抓抓log,看看出问题的时候,有什么规律
------解决方案--------------------
你的蓝牙模块和CPU是什么接口的?有其他的无线模块比如WIFI吗?是否是硬件干扰引起的?
------解决方案--------------------
蓝牙打印是用的什么协议,是不是直接发送数据就直接打印?
串口句柄变化了,可能是内存溢出,导致句柄值改变了。
另外 可以先测试下串口驱动有没有问题。
------解决方案--------------------
呵呵,这是一个 C++ class 的问题。
在 CPdd2450Uart 定义的是有个虚函数,
在 CPdd2450Serial1 里面对这个函数重载了
所以,这里面的代码没任何意义~!
------解决方案--------------------