打印
[开发工具]

请帮忙测试一下这个支持USB虚拟串口热插拔的串口调试助手

[复制链接]
楼主: mohanwei
手机看帖
扫描二维码
随时随地手机跟帖
21
mohanwei|  楼主 | 2015-7-6 12:13 | 只看该作者 |只看大图 回帖奖励 |倒序浏览
本帖最后由 mohanwei 于 2015-7-6 12:14 编辑
奔牛滚滚 发表于 2015-7-5 21:53
软件有严重的bug,我的串口模块,通过hub接的,串口号应该是28和30号,结果提示串口2,串口3插入,串口列表也没 ...

突然想起,你这个64位win7如果能打开这个软件,但从注册表读不出串口列表,问题应该出在权限上,win7的权限控制的比较严……你可以在工具上右键点击“以管理员身份运行”,大部分情况下就正常了



附上USB插拔识别技术:http://www.codeproject.com/Articles/14500/Detecting-Hardware-Insertion-and-or-Removal
原作者编译好的exe也发上来:
HwDetect_exe.zip (19.57 KB)
你可以测试一下手头的USB设备是否能正常识别……我刚试了一下,STM32虚拟串口可以识别,CP2102串口线就识别不了:

所以你的串口线也有可能不能正确识别串口号……

使用特权

评论回复
22
mohanwei|  楼主 | 2015-7-6 12:20 | 只看该作者
huangqi412 发表于 2015-7-6 11:22
不知道你的能不能打开虚拟串口,以及名字很长的串口(比如飞思卡尔板子上那个USB转串口,废卡的人 ...

这个是够变态的……
不过你可以用这个工具试一下,如果不行,把20楼的从注册表枚举串口号的代码里的60、80都改大,应该就可以了。
API的缓冲区大小是MAX_PATH (刚看了一下定义是260),所以读出肯定没问题,问题是原作者可能想节约点RAM……然后大家copy过来就能用,也懒得去钻研了:lol

使用特权

评论回复
23
奔牛滚滚| | 2015-7-6 12:38 | 只看该作者
mohanwei 发表于 2015-7-6 12:13
突然想起,你这个64位win7如果能打开这个软件,但从注册表读不出串口列表,问题应该出在权限上,win7的权 ...

给管理员权限,可以看到了.但是你这个方法真不好,用个串口居然要给管理员权限,用户体验不好,而且不知道的还是说的软件有问题.以后的系统只会把权限管理得越来越严,还是调用标准API吧,这样不存在兼容性问题.完全不提示要权限也可以得到串口号

使用特权

评论回复
24
mohanwei|  楼主 | 2015-7-6 13:09 | 只看该作者
奔牛滚滚 发表于 2015-7-6 12:38
给管理员权限,可以看到了.但是你这个方法真不好,用个串口居然要给管理员权限,用户体验不好,而且不知道的 ...

应该没有更好的办法了,你说的那些串口工具,要么是安装版的,在安装时就搞定了管理员权限;要么是没有“只显示实际存在的串口”这项功能,而是一运行程序就用个for循环format出“COM1”,"COM2"...."COMx".等若干个串口号出来供你选择。
win7下没有超级终端了,我找了个绿色版的超级终端,过滤消息后发现它也是通过同样的枚举注册表的方式来获取串口列表的

使用特权

评论回复
25
mohanwei|  楼主 | 2015-7-6 13:17 | 只看该作者
常用的几个串口助手:

使用特权

评论回复
26
mohanwei|  楼主 | 2015-7-6 13:22 | 只看该作者
访问注册表只是很普通的权限吧……:lol
可能是你的系统修改过配置,把登录的用户权限修改了……不要说这个,我用的ghost版32位win7都经常出现某些自己的文件夹无法打开,必须要在文件夹上右键点击选择“管理员获取所有权”才能打开;播放歌曲时也经常发现有些歌无法播放(从其它的XP电脑拷贝过来的),同样操作一番“管理员获取所有权”就可以了

使用特权

评论回复
27
huangqi412| | 2015-7-6 13:29 | 只看该作者
mohanwei 发表于 2015-7-6 12:13
突然想起,你这个64位win7如果能打开这个软件,但从注册表读不出串口列表,问题应该出在权限上,win7的权 ...

WIN 设备管理器列表,是怎么刷的。

使用特权

评论回复
28
huangqi412| | 2015-7-6 13:30 | 只看该作者
mohanwei 发表于 2015-7-6 12:20
这个是够变态的……
不过你可以用这个工具试一下,如果不行,把20楼的从注册表枚举串口号的代码里的60、8 ...

试了可以打开

使用特权

评论回复
29
mohanwei|  楼主 | 2015-7-6 13:36 | 只看该作者
huangqi412 发表于 2015-7-6 13:29
WIN 设备管理器列表,是怎么刷的。

看一下21楼的codeproject参考代码……通过一系列的API来获取那个设备类型和描述字符串,我拷贝过来编译通过就不管了,没有进一步了解

使用特权

评论回复
30
mohanwei|  楼主 | 2015-7-7 21:50 | 只看该作者
补充:V1.0.19是从注册表来读取当前串口列表的,然后根据串口号,调用win32 API获得完整的串口名称如“STM32 Virtual COM Port (COM2)”,对于某些驱动程序不走寻常路的USB转串口线可能会不能正确显示……

V1.0.20是改进了算法的,经测试在XP和32位win7下都能正确显示完整的串口名称(跟你在windows设备管理器上看到的那一串字符相同)……已更新到首页

使用特权

评论回复
31
可可球| | 2015-7-7 22:34 | 只看该作者
WIN732位系统下,还可以

使用特权

评论回复
32
mohanwei|  楼主 | 2015-7-8 08:53 | 只看该作者
可可球 发表于 2015-7-7 22:34
WIN732位系统下,还可以

谢谢!
在你的电脑直接双击就可以正常运行,还是需要右键点击“以管理员身份运行”?

使用特权

评论回复
33
hwl1023| | 2015-7-8 08:59 | 只看该作者
感谢分享!!!

使用特权

评论回复
34
i6950| | 2015-7-9 10:45 | 只看该作者
有问题,少列出一个虚拟串口
win7 64位,用管理员权限打开也不行

LZ得改一下枚举的方法,
不要用读注册表的方法,超不准的
应该改用你SETUPAPI.DLL的API,就像你转的那个codeproject的例子

使用特权

评论回复
35
mohanwei|  楼主 | 2015-7-9 10:55 | 只看该作者
i6950 发表于 2015-7-9 10:45
有问题,少列出一个虚拟串口
win7 64位,用管理员权限打开也不行

你是用V1.0.19吗?那个已经改了……
现在更新到V1.0.21,用的是从设备管理器读取的方法,xp和32位win7没有遗漏

使用特权

评论回复
36
i6950| | 2015-7-9 11:01 | 只看该作者
mohanwei 发表于 2015-7-9 10:55
你是用V1.0.19吗?那个已经改了……
现在更新到V1.0.21,用的是从设备管理器读取的方法,xp和32位win7没 ...

就是最新版本1.0.21的
还是少读一个虚拟串口

使用特权

评论回复
37
mohanwei|  楼主 | 2015-7-9 11:10 | 只看该作者
STM32无意中完成了一次远程溢出攻击,成功使服务器上的串口测试工具出错自动关闭……:lol

昨天开始调试一块STM32板(前面就准备本帖这个串口调试工具和移植STM32的虚拟串口例程),开始添加各种菜单……上电时会把当前的已有功能全部打印到上位机串口测试工具……
突然发现新增了某一个功能后,复位板子,上位机串口测试工具先自动关闭,然后再次打开,然后自动消失,然后就没有然后了……
我眨眨眼睛,再来一次,串口测试工具又自动消失了……
回想一下刚才改了什么,然后把那个STM板新增功能屏蔽,结果好了……
只好用VC打开串口调试工具工程,在串口接收线程下了个断点,一番调试,终于发现了bug:
1-抄来的代码大致如下:
rcv_thread()
{
     char buff[1024];//定义串口接收缓冲区为1024字节
    其它变量定义……
     while(h_COM)
    {
            int len = GetCommRxLen();//获取当前串口驱动的接收缓冲区数据长度
            if(len)//有数据
            {
                     read(buff,len);//读取数据到buff————就在这里出问题:STM32板上电后就打印功能,从开始的几十字节慢慢增加到超过1KB,超过1KB后,串口调试工具一打开串口,第一个包就会把buff撑爆,修改了buff后面定义的变量,无意完成了一次远程溢出攻击……
                     deal(buff);//处理接收数据
            }
            ……
    }
}

稍微修改一下就好了:
rcv_thread()
{
     char buff[1024];//定义串口接收缓冲区为1024字节
    其它变量定义……
     while(h_COM)
    {
            int len = GetCommRxLen();//获取当前串口驱动的接收缓冲区数据长度
            if(len)//有数据
            {
                     if(len>sizeof(buff))//数据太多时,分批读取,每次不超过buff长度
                     {
                             len = sizeof(buff);
                     }

                     read(buff,len);//读取数据到buff————就在这里出问题:STM32板上电后就打印功能,从开始的几十字节慢慢增加到超过1KB,超过1KB后,串口调试工具一打开串口,第一个包就会把buff撑爆,修改了buff后面定义的变量,无意完成了一次远程溢出攻击……
                     deal(buff);//处理接收数据
            }
            ……
    }
}

新版本V1.0.21已更新到首页

使用特权

评论回复
38
mohanwei|  楼主 | 2015-7-9 11:19 | 只看该作者
i6950 发表于 2015-7-9 11:01
就是最新版本1.0.21的
还是少读一个虚拟串口

能把设备管理器的串口节点展开,截个图;再把串口测试工具在点击端口配置后,在接收窗打印出来的串口列表截个图,一起传上来吗?

使用特权

评论回复
39
i6950| | 2015-7-9 11:26 | 只看该作者
我用的是com0com
你自己装个com0com更容易调试

使用特权

评论回复
40
i6950| | 2015-7-9 11:35 | 只看该作者
mohanwei 发表于 2015-7-9 11:10
STM32无意中完成了一次远程溢出攻击,成功使服务器上的串口测试工具出错自动关闭……

昨天开始调试一 ...

ReadFile不是要传buffer的长度进去吗? 难道你没用上?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则