怎样才能用BCB自动检测新增串口
用USB转串口的芯片通信,当插入USB线后会在电脑里自动增加一个串口,如果能在程序里自动检测到这个新增的串口,而不是手工的去指定串口,这样使用起来就方便得多了。我现用的是TYbCommDevice串口控件,当插入USB线后,在端口设置里增加了一个端口(COM3或COM5等不定),打开注册表
HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\SERIALCOMM,也发现新增了同样的端口,但就是不知怎样用BCB编程自动找到这个新增的端口,有高手能指点一下吗?
我学习BCB编程时间不长,上面的问题想了好久不得其解,找了很多资料也没得答案,真不知从何着手。 去查注册表,不过我用VC,BCB不懂 那检测USB插入的消息好了,查这个USB芯片的GUID,然后注册变更消息通知,然后处理win发过来的硬件变更消息就好了 Windows Registry Editor Version 5.00
"\\Device\\Serial0"="COM1" 调用读注册表的函数。 谢谢以上各位高手指点,但目前的我还是一头雾水,未求得解决方法,(唉,只怪我学术不精)。哪位高手是否可以提供详细点的解决方案或这方面的参考资料也行,在这里谢谢先。
下面简单说说我的东东及想急需解决的问题:我做的是用电脑经过USB转串口线进行控制由单片机制作的一个小仪器,串口的通讯参数如波特率,数据位等已经用程序设好,使用时不需改变,唯独端口这项COM1(或许是COM2,COM3.....)不能用程序设定,因为在不同的电脑及同一台电脑的不同USB插口,这个COM*是不确定的,因此我的这个程序就必需保留(如图)的这个按钮,使用起来非常不方便,如何能省掉这个按钮及“端口设置”这个对话框,让程序自动找到与小仪器的通讯端口,这就是我想要的东东。
http://cache.amobbs.com/bbs_upload782111/files_17/ourdev_464591.jpg
(原文件名:11.jpg) 顶! 如果用comport控件我知道怎么做,但TYbCommDevice就不知道了 读注册表后就知道串口数了,再通过握手就知道要使用哪个串口了 TYbCommDevice 就可以自动识别电脑的所有串口.. 你要自动识别哪个串口和你设备相连的话.就用楼上的方法--握手 感谢有这么多网友给支招,但我乃不知怎样具体编写程序,我好笨哦,呵呵。
这贴子的原意是:能否使“USB转串口设备”在使用中就像使用U盘那么方便,(即插入U盘在“我的电脑”就出现一个盘符,拔出U盘该盘符就即刻消失,但程序不会出现死机现象)。
觉得读注册表这个方法不错,但具体怎么实现现在不懂,下面换一种提问方式,看看是否有高手给出BCB原程序代码。(如果程序很麻烦,给点提示或付费也行,谢谢先)。
题目是这样:建一个窗口,放上一个控件Edit1,通过程序来实现:当插入USB/232线,Edit1显示该串口的编号,当拔出线时,Edit1显示的是0,(见下图)。若能实现以上功能,目的就容易达到了。
http://cache.amobbs.com/bbs_upload782111/files_17/ourdev_465287.jpg
(原文件名:3.jpg) 现在市场上的电脑在接口方面大多已取消了传统的9针串行接插口,与此同时市场上推出了大量的"USB转串口线",价格从几元到几十元钱,这给常使用串行通讯的使用者带来方便,但如何使用好这种线,是否能像真正的USB设备一样那样,即插即用,(好象原九针串插头是不允许带电拔插的).这给串口编程爱好者带来新的课题,那就是能否自动找到新增串口,有这方面使用经验的网友是否能给介绍介绍.
http://cache.amobbs.com/bbs_upload782111/files_17/ourdev_465669.jpg
(原文件名:1.jpg) Delphi的,我是用Spcom写的:
procedure TForm1.EnumComPorts(Ports: TStrings);
var
KeyHandle: HKEY;
ErrCode, Index: Integer;
ValueName, Data: string;
ValueLen, DataLen, ValueType: DWORD;
TmpPorts: TStringList;
begin
ErrCode := RegOpenKeyEx(
HKEY_LOCAL_MACHINE,
'HARDWARE\DEVICEMAP\SERIALCOMM',
0,
KEY_READ,
KeyHandle);
if ErrCode <> ERROR_SUCCESS then
Exit;// raise EComPort.Create(CError_RegError, ErrCode);
TmpPorts := TStringList.Create;
try
Index := 0;
repeat
ValueLen := 256;
DataLen := 256;
SetLength(ValueName, ValueLen);
SetLength(Data, DataLen);
ErrCode := RegEnumValue(
KeyHandle,
Index,
PChar(ValueName),
Cardinal(ValueLen),
nil,
@ValueType,
PByte(PChar(Data)),
@DataLen);
if ErrCode = ERROR_SUCCESS then
begin
SetLength(Data, DataLen);
TmpPorts.Add(Data);
Inc(Index);
end
else
if ErrCode <> ERROR_NO_MORE_ITEMS then
exit; //raise EComPort.Create(CError_RegError, ErrCode);
until (ErrCode <> ERROR_SUCCESS) ;
TmpPorts.Sort;
Ports.Assign(TmpPorts);
finally
RegCloseKey(KeyHandle);
TmpPorts.Free;
end;
end;
自动识别计算机有多小个控件,不过要关闭程序再打开后就可见到新的串口存在了 SPCOM控件:
SPCOM.PASourdev_465673.rar(文件大小:14K) (原文件名:SPComm.rar)
Delphi中直接添加此控件,然后就有一个类似MSCOM的图标,此控件就可以使用了,非常方便,比MSCOM好用 Delphi调用方法如下:EnumComPorts(COMNumberCoMboBox.Items);COMNumberCoMboBox.Items为所要列出端口号的组合控件(COMBOBOX),即列表框或组合框之类的组件 回复【楼主位】glgyzhou
-----------------------------------------------------------------------
楼主,问题解决了吗,我也有相同的问题,有方法了共享一下,感谢! 咱也关注啊,需要顶 整一个定时器,每秒查询一下注_册表。 学习……
页:
[1]