jufr12315 发表于 2015-7-20 15:29:38

【求助】CSerialPort 获取USB虚拟出来的端口

没接触过C++,现在有个上位机,串口端口想改成STC烧录软件一样的,自动搜索串口的。
如下图,只要有USB转串口,就会自动选中。


下位机是STM32的USB虚拟成一个串口,在设备管理器中显示的串口名如下图:


主要解决的就是,上位机自动获取到STM32虚拟的串口。
刚接触C++,不是很懂。
求指教!       

jufr12315 发表于 2015-7-20 15:33:46

在线等!!!!!!{:lol:}

whatcanitbe 发表于 2015-7-20 15:41:35

本帖最后由 whatcanitbe 于 2015-7-20 15:48 编辑

帮你问了下度娘,度娘说看了http://www.360doc.com/content/11/0825/17/2150347_143237368.shtml应该就明白了。

内容复制不过来,我记得之前是看了这个实现的。回家找找看能不能找到代码发上来。

jufr12315 发表于 2015-7-20 16:00:25

whatcanitbe 发表于 2015-7-20 15:41
帮你问了下度娘,度娘说看了http://www.360doc.com/content/11/0825/17/2150347_143237368.shtml应该就明白 ...

{:lol:} 好的。我在看,有完整的例程更好。

gujiamao_love 发表于 2015-7-20 16:25:03

本帖最后由 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:02

程序初始化的时候,调用。
再用一个定时器实时监测,这样就可以拔掉再插也能实现监测到了。

jufr12315 发表于 2015-7-20 16:34:41

gujiamao_love 发表于 2015-7-20 16:26
程序初始化的时候,调用。
再用一个定时器实时监测,这样就可以拔掉再插也能实现监测到了。 ...

多谢哈!楼上另一位坛友那方法我刚试,可以获取到可用的端口。就是还不知道怎么区分是STM32的还是USB转的。

我看看你的方法先。

gujiamao_love 发表于 2015-7-20 16:44:47

jufr12315 发表于 2015-7-20 16:34
多谢哈!楼上另一位坛友那方法我刚试,可以获取到可用的端口。就是还不知道怎么区分是STM32的还是USB转的 ...

好吧,你看看注册表的信息,应该不一样的。

jufr12315 发表于 2015-7-20 17:51:54

gujiamao_love 发表于 2015-7-20 16:44
好吧,你看看注册表的信息,应该不一样的。

我用注册表的方法,但是怎么知道是STM32的串口?

jufr12315 发表于 2015-7-20 18:01:13

gujiamao_love 发表于 2015-7-20 16:44
好吧,你看看注册表的信息,应该不一样的。

你这个跟网上注册表实现的差不多。
你这个查找 “VCP” 是找串口名称吗?
有些没注释,看不懂。

jufr12315 发表于 2015-7-21 14:59:50

\Device\Serial() -------------------------------COM1 电脑串口
\Device\ProlificSerial()-----------------------Prolific USB-To-Serial .......
\Device\USBSER000-----------------------STMicroelectronics Virtual COM Port
用注册表的方法,获取到的串口名,是上面那样的,而不是设备管理器显示的串口名。
这是什么原因?我哪里出问题

dswkl11 发表于 2015-7-21 17:28:20

有空研究 C# 如何解决

gujiamao_love 发表于 2015-8-3 15:39:48

jufr12315 发表于 2015-7-21 14:59
\Device\Serial() -------------------------------COM1 电脑串口
\Device\ProlificSerial()-------------- ...

你是说注册表的数值不是comXX么?

jufr12315 发表于 2015-8-3 18:29:40

gujiamao_love 发表于 2015-8-3 15:39
你是说注册表的数值不是comXX么?

注册表可以获取到COMxx,但是我想获取到设备管理器端口显示的那样。

gujiamao_love 发表于 2015-8-3 18:33:32

jufr12315 发表于 2015-8-3 18:29
注册表可以获取到COMxx,但是我想获取到设备管理器端口显示的那样。

我之前是用ftXX的驱动是可以获取完整的,但显然不通用。
用注册表,我只能获取到串口号...但是足够区分st虚拟的串口跟正常的串口了吧

ysu533 发表于 2015-8-3 19:46:40

gujiamao_love 发表于 2015-7-20 16:26
程序初始化的时候,调用。
再用一个定时器实时监测,这样就可以拔掉再插也能实现监测到了。 ...

插拔会产生相应的消息的, 不用定时器监测。 可以参见 QextSerialPort 的实现。

dengxm2009 发表于 2015-8-4 00:26:42

就是注册表,跟串口类没什么关系.

jufr12315 发表于 2015-8-4 13:08:28

gujiamao_love 发表于 2015-8-3 18:33
我之前是用ftXX的驱动是可以获取完整的,但显然不通用。
用注册表,我只能获取到串口号...但是足够区分st ...

我现在刚找到另一种,用到库的,也用到注册表的,可以获取端口号,还有设备管理器里面端口的名字

jufr12315 发表于 2015-8-4 13:09:14

ysu533 发表于 2015-8-3 19:46
插拔会产生相应的消息的, 不用定时器监测。 可以参见 QextSerialPort 的实现。 ...

是吗?MFC里面可以吗?我现在就用定时器来做的

ysu533 发表于 2015-8-4 17:03:17

jufr12315 发表于 2015-8-4 13:09
是吗?MFC里面可以吗?我现在就用定时器来做的

不能直接用, 这个是封装用于Qt的。 但是它本身是用win api实现的。 你可以参考其代码或者其方法来实现。

jufr12315 发表于 2015-8-5 09:39:07

ysu533 发表于 2015-8-4 17:03
不能直接用, 这个是封装用于Qt的。 但是它本身是用win api实现的。 你可以参考其代码或者其方法来实现。 ...

好的,多谢提醒。我去了解。
页: [1]
查看完整版本: 【求助】CSerialPort 获取USB虚拟出来的端口