【求助】CSerialPort 获取USB虚拟出来的端口
没接触过C++,现在有个上位机,串口端口想改成STC烧录软件一样的,自动搜索串口的。如下图,只要有USB转串口,就会自动选中。
下位机是STM32的USB虚拟成一个串口,在设备管理器中显示的串口名如下图:
主要解决的就是,上位机自动获取到STM32虚拟的串口。
刚接触C++,不是很懂。
求指教! 在线等!!!!!!{:lol:} 本帖最后由 whatcanitbe 于 2015-7-20 15:48 编辑
帮你问了下度娘,度娘说看了http://www.360doc.com/content/11/0825/17/2150347_143237368.shtml应该就明白了。
内容复制不过来,我记得之前是看了这个实现的。回家找找看能不能找到代码发上来。 whatcanitbe 发表于 2015-7-20 15:41
帮你问了下度娘,度娘说看了http://www.360doc.com/content/11/0825/17/2150347_143237368.shtml应该就明白 ...
{:lol:} 好的。我在看,有完整的例程更好。 本帖最后由 gujiamao_love 于 2015-7-20 16:27 编辑
{:lol:} 通过注册表可以的。我之前实现过。
我用的是CVI,但是c函数都是一样的。
void port_refresh(void)
{
int com;
int i,size1,size2;
int type;
unsigned int values; // 子键个数
char valueName;
const char *arr_Subkey_Name="HARDWARE\\DEVICEMAP\\SERIALCOMM";
com = 0;
int nitems;
GetNumListItems(panelHandle, PANEL_PORT, &nitems);
// 获取子键个数
RegQueryInfoOnKey(REGKEY_HKLM, arr_Subkey_Name,NULL, &values, NULL, NULL, NULL);
port_num = values;
if(values != nitems) {
DeleteListItem(panelHandle, PANEL_PORT, 0, -1);
if(values > 0) {
for(i = 0; i < values; i++) {
size1 = MAX_PATH;
size2 = 512;
RegEnumerateValue (REGKEY_HKLM, arr_Subkey_Name,i, valueName, &size1, stringbuffer, &size2,&type);
if(( type == _REG_SZ ) && ( size2 > 0 )){
size1 = FindPattern (valueName, 0, -1, "VCP", 0, 0);
if (size1 > -1) {// 没有找到
//子键名称中含有"VCP"
com_num = get_Port_Number(stringbuffer);
InsertListItem (panelHandle, PANEL_PORT, -1, stringbuffer, i);
//++cnt_test;
}
}
}
} else {
DeleteListItem(panelHandle, PANEL_PORT, 0, -1);
}
}
}
int get_Port_Number(char Device_Name[])
{
int Port_Num,i;
i = Device_Name;
Port_Num = i - 0x30;
i = Device_Name;
if(i != 0x00) {
Port_Num *= 10;
Port_Num += i - 0x30;
i = Device_Name;
if(i != 0x00) {
Port_Num *= 10;
Port_Num += i - 0x30;
}
}
return Port_Num;
}
//部分函数是CVI的,你改成相应MFC的。 程序初始化的时候,调用。
再用一个定时器实时监测,这样就可以拔掉再插也能实现监测到了。 gujiamao_love 发表于 2015-7-20 16:26
程序初始化的时候,调用。
再用一个定时器实时监测,这样就可以拔掉再插也能实现监测到了。 ...
多谢哈!楼上另一位坛友那方法我刚试,可以获取到可用的端口。就是还不知道怎么区分是STM32的还是USB转的。
我看看你的方法先。 jufr12315 发表于 2015-7-20 16:34
多谢哈!楼上另一位坛友那方法我刚试,可以获取到可用的端口。就是还不知道怎么区分是STM32的还是USB转的 ...
好吧,你看看注册表的信息,应该不一样的。 gujiamao_love 发表于 2015-7-20 16:44
好吧,你看看注册表的信息,应该不一样的。
我用注册表的方法,但是怎么知道是STM32的串口? gujiamao_love 发表于 2015-7-20 16:44
好吧,你看看注册表的信息,应该不一样的。
你这个跟网上注册表实现的差不多。
你这个查找 “VCP” 是找串口名称吗?
有些没注释,看不懂。 \Device\Serial() -------------------------------COM1 电脑串口
\Device\ProlificSerial()-----------------------Prolific USB-To-Serial .......
\Device\USBSER000-----------------------STMicroelectronics Virtual COM Port
用注册表的方法,获取到的串口名,是上面那样的,而不是设备管理器显示的串口名。
这是什么原因?我哪里出问题 有空研究 C# 如何解决 jufr12315 发表于 2015-7-21 14:59
\Device\Serial() -------------------------------COM1 电脑串口
\Device\ProlificSerial()-------------- ...
你是说注册表的数值不是comXX么? gujiamao_love 发表于 2015-8-3 15:39
你是说注册表的数值不是comXX么?
注册表可以获取到COMxx,但是我想获取到设备管理器端口显示的那样。 jufr12315 发表于 2015-8-3 18:29
注册表可以获取到COMxx,但是我想获取到设备管理器端口显示的那样。
我之前是用ftXX的驱动是可以获取完整的,但显然不通用。
用注册表,我只能获取到串口号...但是足够区分st虚拟的串口跟正常的串口了吧 gujiamao_love 发表于 2015-7-20 16:26
程序初始化的时候,调用。
再用一个定时器实时监测,这样就可以拔掉再插也能实现监测到了。 ...
插拔会产生相应的消息的, 不用定时器监测。 可以参见 QextSerialPort 的实现。 就是注册表,跟串口类没什么关系. gujiamao_love 发表于 2015-8-3 18:33
我之前是用ftXX的驱动是可以获取完整的,但显然不通用。
用注册表,我只能获取到串口号...但是足够区分st ...
我现在刚找到另一种,用到库的,也用到注册表的,可以获取端口号,还有设备管理器里面端口的名字 ysu533 发表于 2015-8-3 19:46
插拔会产生相应的消息的, 不用定时器监测。 可以参见 QextSerialPort 的实现。 ...
是吗?MFC里面可以吗?我现在就用定时器来做的 jufr12315 发表于 2015-8-4 13:09
是吗?MFC里面可以吗?我现在就用定时器来做的
不能直接用, 这个是封装用于Qt的。 但是它本身是用win api实现的。 你可以参考其代码或者其方法来实现。 ysu533 发表于 2015-8-4 17:03
不能直接用, 这个是封装用于Qt的。 但是它本身是用win api实现的。 你可以参考其代码或者其方法来实现。 ...
好的,多谢提醒。我去了解。
页:
[1]