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

loongembedded
博客专家认证
2012-08-18 06:54:28
加精
问题:
客户的蓝牙应用(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"));
}
麻烦大家帮忙看看,此问题该怎么解决?先谢谢了。
...全文
2084 71 打赏 收藏 转发到动态 举报
写回复
用AI写文章
71 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhengmeifu 2012-09-21
  • 打赏
  • 举报
回复
BcspCommunication::CloseConnection()我也觉得你是否是自己定义的类没有虚构函数,或者哪里没释放掉了,造成这个关闭不了了。你把整个代码发给我们吧,我们编译后在我们设备上测试一下。
loongembedded 2012-09-21
  • 打赏
  • 举报
回复
[Quote=引用 70 楼 的回复:]
BcspCommunication::CloseConnection()我也觉得你是否是自己定义的类没有虚构函数,或者哪里没释放掉了,造成这个关闭不了了。你把整个代码发给我们吧,我们编译后在我们设备上测试一下。
[/Quote]
蓝牙厂家发了一个新的驱动,我移植过来用了,今晚给客户测试,期望反馈回来的是好消息。
loongembedded 2012-09-17
  • 打赏
  • 举报
回复
如果说此蓝牙异常问题无法避免,那么出现此问题时,如何再不需要重启的情况下,通过软件来回复蓝牙的使用?再此向大家请教了。
dengchonglin 2012-09-15
  • 打赏
  • 举报
回复
[Quote=引用 40 楼 的回复:]
引用 39 楼 的回复:
期待楼主把解决问题的经验分享给大家~

如果解决了,肯定会分享的,我这里有个问题需要大家也帮忙确认一下,我的处理器是S3C2451的,串口驱动的ULONG CPdd2450Uart::GetModemStatus()函数中包含下面的代码:
if (ubModemStatus & (1<<2))
Events |= EV_CTS;
根据2451串口……
[/Quote]
呵呵,这是一个 C++ class 的问题。
在 CPdd2450Uart 定义的是有个虚函数,
在 CPdd2450Serial1 里面对这个函数重载了
所以,这里面的代码没任何意义~!
loongembedded 2012-09-15
  • 打赏
  • 举报
回复
[Quote=引用 65 楼 的回复:]
蓝牙打印是用的什么协议,是不是直接发送数据就直接打印?

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

另外 可以先测试下串口驱动有没有问题。
[/Quote]
蓝牙打印是应用程序通过串口发送给蓝牙模块,蓝牙模块再把数据发送给打印机打印的,我们的手持机和打印机是分开的。你说的“串口句柄变化了,可能是内存溢出”,如果是这样,是什么原因导致内存泄露,又该如何防止,另外就是如果确保串口驱动是否有没有问题,我这几天再抽空调试串口驱动,期望大侠指教啊。
loongembedded 2012-09-15
  • 打赏
  • 举报
回复
[Quote=引用 43 楼 的回复:]
这个要用什么编缉,用哪一个版本编译工具
[/Quote]
你好,你也有蓝牙打印异常的问题吗?现象一样的吗?另外就是你们是什么平台和什么操作系统的?
liangxd09 2012-09-12
  • 打赏
  • 举报
回复
蓝牙打印是用的什么协议,是不是直接发送数据就直接打印?

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

另外 可以先测试下串口驱动有没有问题。
loongembedded 2012-09-11
  • 打赏
  • 举报
回复
最近客户的测试发现,问题还是存在,这个问题还没有彻底解决,根据客户反馈回来的信息,异常发生在连接蓝牙打印机的时候出现的。
loongembedded 2012-09-07
  • 打赏
  • 举报
回复
[Quote=引用 62 楼 的回复:]
你的蓝牙模块和CPU是什么接口的?有其他的无线模块比如WIFI吗?是否是硬件干扰引起的?
[/Quote]
是串口,有WIFI,GPRS,camera模块,是否是硬件干扰还不好排查,后来客户加快了蓝牙打印的速度后,现象就容易出来了。
loongembedded 2012-09-06
  • 打赏
  • 举报
回复
[Quote=引用 60 楼 的回复:]
建议你还是好好debug一下串口通讯那部分,仅仅恢复操作,治标不治本

做一个调试版本,抓抓log,看看出问题的时候,有什么规律
[/Quote]
对,这部分工作是要尽快进行的,串口驱动都好好查查。
zhengmeifu 2012-09-06
  • 打赏
  • 举报
回复
你的蓝牙模块和CPU是什么接口的?有其他的无线模块比如WIFI吗?是否是硬件干扰引起的?
loongembedded 2012-09-05
  • 打赏
  • 举报
回复
后来经过客户多天的使用,虽然提高了线程优先级,此问题还是存在,比如3台设备工作4天出现了3次,比之前好多了,但还是存在,有什么办法避免这种情况的发生,或者说发生异常的时候,通过软件怎么回复让蓝牙模块继续工作,期望大家分享一下,先谢谢了。
bbstr 2012-09-05
  • 打赏
  • 举报
回复
建议你还是好好debug一下串口通讯那部分,仅仅恢复操作,治标不治本

做一个调试版本,抓抓log,看看出问题的时候,有什么规律
LAONINGA098 2012-08-30
  • 打赏
  • 举报
回复
说的好,很有道理。
yrj 2012-08-29
  • 打赏
  • 举报
回复
串口的流控是怎么设置的。可能是没有流控,或者流控方式不一致。
amani0909 2012-08-27
  • 打赏
  • 举报
回复
另外出现异常的时候,我卸载btd.dll后再重新加载,还是在createfile这个函数这里返回无效,返回码是12,表示访问码无效。
loongembedded 2012-08-25
  • 打赏
  • 举报
回复
解决的办法在41楼已经分享,但这里还有一个问题,就是假如还是出现蓝牙异常之种情况,通过软件改怎么恢复让蓝牙继续工作,而不需要重新启动。
shiwaxinge3000 2012-08-24
  • 打赏
  • 举报
回复
说的好,很有道理。
a1023028574 2012-08-23
  • 打赏
  • 举报
回复
期待楼主把解决问题的经验分享给大家~
loongembedded 2012-08-23
  • 打赏
  • 举报
回复
我这里有个问题需要大家也帮忙确认一下,我的处理器是S3C2451的,串口驱动的ULONG CPdd2450Uart::GetModemStatus()函数中包含下面的代码:
if (ubModemStatus & (1<<2))
Events |= EV_CTS;
根据2451串口部分的描述,1<<2应该改为1<<才对,大家帮忙确认一下,我看到S3C6410上面这里就是左移4位的。
加载更多回复(38)

19,502

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 嵌入开发(WinCE)
社区管理员
  • 嵌入开发(WinCE)社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧