WinCE下的IrCOMM如何确定串口名称?

lijinyan3000 2010-10-21 03:09:49
最近在做IrDA编程.本来使用IrSock进行开发的.但是现在要换成IrCOMM来通讯.

我的PC上有个USB接口的红外适配器,在windows xp上安装了一个IrCOMM2K,安装时指定的串口是COM6.

在WinCE上,传说中默认支持IrCOMM,按照网上文章,HKEY_LOCAL_MACHINE\Drivers\Builtin\IrCOMM下的index的值就指定了串口名称,因为index的值是3,所以就是COM3了.但是...

但是...我直接去打开COM3,发现返回失败...

请高手指点!
...全文
243 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
mabugang 2010-10-23
  • 打赏
  • 举报
回复
这个关注一下 好 期待答案
FrankBIBI 2010-10-23
  • 打赏
  • 举报
回复
[HKEY_LOCAL_MACHINE\Drivers\BuiltIn\IrCOMM]
"Index"=dword:6 ; Overwriting with common.reg


我的6410下面的红外对应的是COM6~ LZ用贴出来的代码肯定能找到PORT号 呵呵~代码不错 收下了
loongembedded 2010-10-22
  • 打赏
  • 举报
回复
有这样的可能,就是你的系统中已占用了COM3,你检查一下你的注册表文件,看是否也有其他地方用了COM3
PQM09 2010-10-22
  • 打赏
  • 举报
回复
查注册表,看看对应的端口号是多少?
lijinyan3000 2010-10-22
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 loongembedded 的回复:]

但是...我直接去打开COM3,发现返回失败...
---》表示对应的驱动没有加载或者没有加载成功,对于IrCOMM,应该还要加入对应的组件吧。
[/Quote]

我不知道有什么对应的IrCOMM的组件,请指点.
lijinyan3000 2010-10-22
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 macrozhang001 的回复:]

跟楼上意见相同,

另外你可以在网上找一个串口工具,试试.
[/Quote]

我是用常用的WinCe串口调试助手来测试的.暂时还没有自己写代码.
lijinyan3000 2010-10-22
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 flandy1982 的回复:]

Prefix 值是 COM吗? 如果是 直接操作"COM3:"就可以了啊
[/Quote]

Prefix的值是COM.但是直接去打开"COM3:",打开失败.
loongembedded 2010-10-22
  • 打赏
  • 举报
回复
但是...我直接去打开COM3,发现返回失败...
---》表示对应的驱动没有加载或者没有加载成功,对于IrCOMM,应该还要加入对应的组件吧。
lijinyan3000 2010-10-22
  • 打赏
  • 举报
回复
我上面贴的这段代码,大家仔细看看,很明确的指出了查找时的先后顺序,其它的可以都找不到的时候,最后再来找"Drivers\\BuiltIn\\IrCOMM"下面的东东.

还有配合unsway123指点的Active下的串口,进行确认就行了.
lijinyan3000 2010-10-22
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 unsway123 的回复:]

驱动加载成功没,可以在注册表下看下active的键值有没有你想要的COM
[/Quote]

非常感谢指点,查看了Active下面发现有效地COM,发现COM2对应着IrDA.

并且还找到一段代码,用来查找IrCOMM的串口名称,不敢独享,贴出来分享:


UINT CIrdaPort::FindPortIndex()
{
// Look into the registry for the infrared port number

UINT uiPort = 0;
HKEY hKey = NULL;

if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, _T("Drivers\\BuiltIn\\IrDA"), 0, 0, &hKey) == ERROR_SUCCESS && hKey != NULL)
{
DWORD dwSize = 0;

if (RegQueryValueEx(hKey, _T("Index"), NULL, NULL, NULL, &dwSize) == ERROR_SUCCESS)
{
if ((dwSize > 0) && (dwSize <= sizeof(DWORD)))
{
DWORD dwData = 0;

if (RegQueryValueEx(hKey, _T("Index"), NULL, NULL, (LPBYTE) &dwData, &dwSize) == ERROR_SUCCESS)
{
uiPort = (UINT) dwData;
}
}
}

RegCloseKey(hKey);
}

if (uiPort != 0)
return uiPort;

if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, _T("Comm\\IrDA"), 0, 0, &hKey) == ERROR_SUCCESS && hKey != NULL)
{
DWORD dwSize = 0;

if (RegQueryValueEx(hKey, _T("Port"), NULL, NULL, NULL, &dwSize) == ERROR_SUCCESS)
{
if ((dwSize > 0) && (dwSize <= sizeof(DWORD)))
{
DWORD dwData = 0;

if (RegQueryValueEx(hKey, _T("Port"), NULL, NULL, (LPBYTE) &dwData, &dwSize) == ERROR_SUCCESS)
{
uiPort = (UINT) dwData;
}
}
}

RegCloseKey(hKey);
}

if (uiPort != 0)
return uiPort;

if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, _T("Comm\\IrDA\\Linkage"), 0, 0, &hKey) == ERROR_SUCCESS && hKey != NULL)
{
DWORD dwSize = 0;

if (RegQueryValueEx(hKey, _T("Bind"), NULL, NULL, NULL, &dwSize) == ERROR_SUCCESS)
{
if ((dwSize >= sizeof(TCHAR)) && (dwSize % sizeof(TCHAR) == 0))
{
LPTSTR pszSubKey = new TCHAR[dwSize / sizeof(TCHAR) + 1];

if (RegQueryValueEx(hKey, _T("Bind"), NULL, NULL, (LPBYTE) pszSubKey, &dwSize) == ERROR_SUCCESS)
{
pszSubKey[dwSize / sizeof(TCHAR)] = _T('\0');

CString strSubKey;
strSubKey.Format(_T("Comm\\%s\\Parms"), pszSubKey);

// AfxMessageBox(strSubKey);

HKEY hNewKey = NULL;

if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, strSubKey, 0, 0, &hNewKey) == ERROR_SUCCESS && hNewKey != NULL)
{
dwSize = 0;

if (RegQueryValueEx(hNewKey, _T("Port"), NULL, NULL, NULL, &dwSize) == ERROR_SUCCESS)
{
if ((dwSize > 0) && (dwSize <= sizeof(DWORD)))
{
DWORD dwData = 0;

if (RegQueryValueEx(hNewKey, _T("Port"), NULL, NULL, (LPBYTE) &dwData, &dwSize) == ERROR_SUCCESS)
{
uiPort = (UINT) dwData;
}
}
}

RegCloseKey(hNewKey);
}
}

delete [] pszSubKey;
}
}

RegCloseKey(hKey);
}

if (uiPort != 0)
return uiPort;

if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, _T("Drivers\\BuiltIn\\IrCOMM"), 0, 0, &hKey) == ERROR_SUCCESS && hKey != NULL)
{
DWORD dwSize = 0;

if (RegQueryValueEx(hKey, _T("Index"), NULL, NULL, NULL, &dwSize) == ERROR_SUCCESS)
{
if ((dwSize > 0) && (dwSize <= sizeof(DWORD)))
{
DWORD dwData = 0;

if (RegQueryValueEx(hKey, _T("Index"), NULL, NULL, (LPBYTE) &dwData, &dwSize) == ERROR_SUCCESS)
{
uiPort = (UINT) dwData;
}
}
}

RegCloseKey(hKey);
}

return uiPort;
}


IT铁哥 2010-10-21
  • 打赏
  • 举报
回复
跟楼上意见相同,

另外你可以在网上找一个串口工具,试试.
unsway123 2010-10-21
  • 打赏
  • 举报
回复
驱动加载成功没,可以在注册表下看下active的键值有没有你想要的COM
Ei 2010-10-21
  • 打赏
  • 举报
回复
驱动加载成功了没有?
FLandY1982 2010-10-21
  • 打赏
  • 举报
回复
Prefix 值是 COM吗? 如果是 直接操作"COM3:"就可以了啊

19,503

社区成员

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

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