搜索
bottom↓
回复: 20

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

[复制链接]

出20入26汤圆

发表于 2015-7-20 15:29:38 | 显示全部楼层 |阅读模式
没接触过C++,现在有个上位机,串口端口想改成STC烧录软件一样的,自动搜索串口的。
如下图,只要有USB转串口,就会自动选中。


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


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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出20入26汤圆

 楼主| 发表于 2015-7-20 15:33:46 | 显示全部楼层
在线等!!!!!!

出100入85汤圆

发表于 2015-7-20 15:41:35 | 显示全部楼层
本帖最后由 whatcanitbe 于 2015-7-20 15:48 编辑

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

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

出20入26汤圆

 楼主| 发表于 2015-7-20 16:00:25 | 显示全部楼层
whatcanitbe 发表于 2015-7-20 15:41
帮你问了下度娘,度娘说看了http://www.360doc.com/content/11/0825/17/2150347_143237368.shtml应该就明白 ...

好的。我在看,有完整的例程更好。

出0入0汤圆

发表于 2015-7-20 16:25:03 | 显示全部楼层
本帖最后由 gujiamao_love 于 2015-7-20 16:27 编辑

通过注册表可以的。我之前实现过。
我用的是CVI,但是c函数都是一样的。
void port_refresh(void)
{
        int com;
        int i,size1,size2;
        int type;
        unsigned int values;    // 子键个数
        char valueName[MAX_PATH];
        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[3];
        Port_Num = i - 0x30;
        i = Device_Name[4];
        if(i != 0x00) {
                  Port_Num *= 10;
                  Port_Num += i - 0x30;   
                  i = Device_Name[5];
                  if(i != 0x00) {
                           Port_Num *= 10;
                          Port_Num += i - 0x30;
            }
          }
          return Port_Num;   
}
//部分函数是CVI的,你改成相应MFC的。

出0入0汤圆

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

出20入26汤圆

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

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

我看看你的方法先。

出0入0汤圆

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

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

出20入26汤圆

 楼主| 发表于 2015-7-20 17:51:54 | 显示全部楼层
gujiamao_love 发表于 2015-7-20 16:44
好吧,你看看注册表的信息,应该不一样的。

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

出20入26汤圆

 楼主| 发表于 2015-7-20 18:01:13 | 显示全部楼层
gujiamao_love 发表于 2015-7-20 16:44
好吧,你看看注册表的信息,应该不一样的。

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

出20入26汤圆

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

出0入0汤圆

发表于 2015-7-21 17:28:20 | 显示全部楼层
有空研究 C# 如何解决

出0入0汤圆

发表于 2015-8-3 15:39:48 | 显示全部楼层
jufr12315 发表于 2015-7-21 14:59
\Device\Serial() -------------------------------COM1 电脑串口
\Device\ProlificSerial()-------------- ...

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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出20入26汤圆

 楼主| 发表于 2015-8-3 18:29:40 | 显示全部楼层
gujiamao_love 发表于 2015-8-3 15:39
你是说注册表的数值不是comXX么?

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

出0入0汤圆

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

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

出0入0汤圆

发表于 2015-8-3 19:46:40 | 显示全部楼层
gujiamao_love 发表于 2015-7-20 16:26
程序初始化的时候,调用。
再用一个定时器实时监测,这样就可以拔掉再插也能实现监测到了。 ...

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

出0入0汤圆

发表于 2015-8-4 00:26:42 来自手机 | 显示全部楼层
就是注册表,跟串口类没什么关系.

出20入26汤圆

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

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

出20入26汤圆

 楼主| 发表于 2015-8-4 13:09:14 | 显示全部楼层
ysu533 发表于 2015-8-3 19:46
插拔会产生相应的消息的, 不用定时器监测。 可以参见 QextSerialPort 的实现。 ...

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

出0入0汤圆

发表于 2015-8-4 17:03:17 | 显示全部楼层
jufr12315 发表于 2015-8-4 13:09
是吗?MFC里面可以吗?我现在就用定时器来做的

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

出20入26汤圆

 楼主| 发表于 2015-8-5 09:39:07 | 显示全部楼层
ysu533 发表于 2015-8-4 17:03
不能直接用, 这个是封装用于Qt的。 但是它本身是用win api实现的。 你可以参考其代码或者其方法来实现。 ...

好的,多谢提醒。我去了解。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-8-25 23:04

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表