打印
[开发工具]

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

[复制链接]
7606|52
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 mohanwei 于 2015-7-9 10:40 编辑

有几个产品需要用STM32的USB口跟上位机通信,基于ST提供的USB转虚拟串口例程来修改,调试时电脑蓝屏了几次,所以捣鼓出了这个工具……
相比其它串口调试助手做了一些改进:
1-打开串口后,如果突然拔掉USB转串口线,本工具可以自动停止对串口的读写、然后关闭串口;
2-在1的基础上,如果重新插入该USB转串口线,本工具检测到串口号跟之前的相同,则会自动打开串口;
这样在下位机调试程序时,就不用小心频繁的在电脑上关闭/打开串口了
目前USB转串口线只测试了3种:STM32的USB转虚拟串口、CP2101、FT232。没发现蓝屏现象

请各位手头有各种传说中很差的USB转串口线的朋友帮忙测试一下:
1-首先确保你的电脑没有打开其它文件和软件(蓝屏时这些文件无法保存甚至受损):lol
2-打开本工具,插入USB转串口线,把USB转串口线的RXD和TXD短接(环回测试)
3-点击“配置端口”,在左上角选择该USB转串口线对应的串口号,再点击“保存为缺省值”,再点击“确定”
4-点击“连接”
5-把左下角的周期改为50,然后点击“自动发送”,此时接收窗口将不停收到数据
6-把USB转串口线拔掉,工具应自动关闭串口;再把USB转串口线重新插上,工具应自动打开串口,并且继续自动发送和接收数据……反复20次。如果有蓝屏或者CPU占用率过高请回帖反馈。



               关于通信调试助手

    感谢龚建伟发布的串口助手源码,它提供了一个串口调试助手的框架和大部分该有的功能……
    原来的bug和不如意的地方如下:
    1.当发送端数据发送很快的时候,接收会丢数据;
    2.不能显示中文,用printf()调试单片机程序的时候很不方便;
    3.数据量大的时候占用系统资源太多,显示太慢;
    4.Mscomm控件用起来不方便,而且还要注册,不符合绿色环保的理念;
    5.选择串口号前还要先到设备管理器看看是哪个;
    6.用USB转串口线时,如果在访问串口过程拔掉USB转串口线,windows会蓝屏!其它打开的文件无法保存甚至会被销毁!
    ......
    改进的地方如下:
    1.数据发送、接收各用单独的线程来实现,缓冲区采用一维数组环形缓冲区;
    2.支持显示中文,新编“十六进制<->Ascii”转换算法,支持多种格式的十六进制输入(可以无空格,或者用空格、逗号、分号、下划线、中划线等字符来做间隔);
    3.由于采用多线程,可以方便扩展其它通信模式,如并口、USB和以太网……
    4.直接用API实现发送、接收,简单可靠;
    5.只显示当前可用的串口号;支持COM1-COM255
    6.增加USB转串口线的拔出检测:拔出时自动停止读写串口,并自动关闭串口;
    7.增加USB转串口线的插入检测:在上一步过后,如果用户插入USB转串口线,可以自动重新打开串口.
      这两个功能非常实用,我们在调试带USB接口的单片机时,下载程序、调试器重新运行程序等操作都可能导致上位机虚拟串口移除、插入……
      用其它串口调试助手时,你要小心的先关闭串口,再操作下位机,否则系统会蓝屏;下位机重新上电运行后,还要重新去打开串口……
    ......

补充:上面那个是从注册表来读取当前串口列表的,然后根据串口号,调用win32 API获得完整的串口名称如“STM32 Virtual COM Port (COM2)”,对于某些驱动程序不走寻常路的USB转串口线可能会不能正确显示……
下面这个是改进了算法的,经测试在XP和32位win7下都能正确显示完整的串口名称(跟你在windows设备管理器上看到的那一串字符相同):

补充:前面的都有bug,如果串口驱动使用了缓冲区并且在打开前就已经积累了超过1KB数据,前面的工具一打开就会读取超过1KB数据,使自己的接收缓冲区(1024字节)溢出……下面这个是修正了这个bug的,每次只读取不超过接收缓冲区大小的数据:
通信调试助手V1.0.21.zip (155.77 KB)
通信调试助手V1.0.21.zip (155.77 KB)



评论
mohanwei 2020-8-21 20:51 回复TA
@Jerrycousin :“自动发送多条指令”是指?如果你的指令有帧头帧尾,直接拼在一起当一条发就可以了 
Jerrycousin 2020-5-8 13:55 回复TA
可以加个自动发送多条指令吗 
评分
参与人数 1威望 +1 收起 理由
i6950 + 1 赞一个!
沙发
mohanwei|  楼主 | 2015-7-2 16:25 | 只看该作者

STM32F103跑虚拟串口例程,没有优化,工具发送给STM32的速度大约270KB/s

使用特权

评论回复
板凳
mmuuss586| | 2015-7-2 20:16 | 只看该作者

不错;
写这个小软件花了好几天吧;

使用特权

评论回复
地板
mohanwei|  楼主 | 2015-7-3 20:53 | 只看该作者
测试了一下xp,2k,32位win7,没发现兼容性问题了
有一条串口线插上去后需要几秒钟才会在设备管理器出现串口号,拔出倒是消失得很快……解决办法就是检测到插入后,延时几百毫秒再打开串口,缺点就是其他串口线也会被拖累一点时间

使用特权

评论回复
5
yuangaoping| | 2015-7-3 21:49 | 只看该作者
WIN7下测试,很好用

使用特权

评论回复
6
搞IT的| | 2015-7-3 22:05 | 只看该作者
感觉不错,多谢分享。。

使用特权

评论回复
7
airwill| | 2015-7-4 07:07 | 只看该作者
本帖最后由 airwill 于 2015-7-4 07:12 编辑

嗯, 不错啊, 你使用了Windows 设备拔出通告的消息吧, 也使用插入通告消息.
怎么能更大可能减少蓝屏发生

使用特权

评论回复
8
mohanwei|  楼主 | 2015-7-4 08:27 | 只看该作者
airwill 发表于 2015-7-4 07:07
嗯, 不错啊, 你使用了Windows 设备拔出通告的消息吧, 也使用插入通告消息.
怎么能更大可能减少蓝屏发生 ...

应该是微软或者这写USB转串口线厂家的底层驱动没做好吧。
很多人都发现的现象就是:
1-如果不访问串口,不停插拔USB口也不会导致蓝屏
2-如果插上USB口后,打开串口并收发数据,此时突然拔出,就会蓝屏

如果串口工具在收到WM_DEVICECHANGE消息后分拣,发现是这个串口被移除就及时停止访问,就可以避免出错

使用特权

评论回复
9
yhn1973| | 2015-7-4 16:15 | 只看该作者
这是用什么开发语言编的绿色软件?
在串口收发过程中拔出USB口会不会损坏硬件?没敢试插拔,怕把转换器或U口烧了

使用特权

评论回复
10
mohanwei|  楼主 | 2015-7-4 20:53 | 只看该作者
yhn1973 发表于 2015-7-4 16:15
这是用什么开发语言编的绿色软件?
在串口收发过程中拔出USB口会不会损坏硬件?没敢试插拔,怕把转换器或U ...

VC++
这个没法担保……我自己倒是不怕折腾:lol

使用特权

评论回复
11
奔牛滚滚| | 2015-7-4 23:02 | 只看该作者
这几天忙,过两天再试试.
另外请问楼主,你这个串口精灵支持回传换行符吗?试过好些都被替换成空格,使用起来极其不方便

使用特权

评论回复
12
huangqi412| | 2015-7-5 08:15 | 只看该作者
网上串口助手或自己写的临时测试小软件 现成片子或软转换 有时候也在通信中不注意给拔了 也没做插拔处理 好像从没蓝屏过 那位mcuisp大哥的软件早就支持热插拔 不过不会自动续传 会刷新串口列表  mcuisp也常在这个分坛出没

使用特权

评论回复
13
huangqi412| | 2015-7-5 08:19 | 只看该作者
yhn1973 发表于 2015-7-4 16:15
这是用什么开发语言编的绿色软件?
在串口收发过程中拔出USB口会不会损坏硬件?没敢试插拔,怕把转换器或U ...

usb本来就是热插拔既差急用 难道因为他叫转串口就敢逆天?   不热插拔还是usb么

使用特权

评论回复
14
huangqi412| | 2015-7-5 08:23 | 只看该作者
回想了下真没蓝屏过 只是软件死掉

使用特权

评论回复
15
mohanwei|  楼主 | 2015-7-5 20:51 | 只看该作者
huangqi412 发表于 2015-7-5 08:23
回想了下真没蓝屏过 只是软件死掉

windows版本+正版/盗版/ghost+各种硬件+各种线+各种驱动……搭配出来的系统千差万别:lol

08年的时候新配的笔记本没串口了,打申请单让采购买了3条灰绿的,做工看起来不好,他说好便宜,才9块钱一条,识别出来的记得好像是pl2302。刚好第一块板当时串口TXD在后面错被当作输出口又配置了一次,上电后就是低电平——也就是USB转串口线的RXD会被一直拉低。此时这种USB转串口线一插上电脑就会蓝屏(电脑没打开任何访问串口的软件)……后来让采购去换了25元一条的,同样测试就不会异常。

使用特权

评论回复
16
奔牛滚滚| | 2015-7-5 21:52 | 只看该作者
本帖最后由 奔牛滚滚 于 2015-7-5 21:53 编辑

请看下面贴的内容.

使用特权

评论回复
17
奔牛滚滚| | 2015-7-5 21:53 | 只看该作者
mohanwei 发表于 2015-7-3 20:53
测试了一下xp,2k,32位win7,没发现兼容性问题了
有一条串口线插上去后需要几秒钟才会在设备管理器出现串 ...

软件有严重的bug,我的串口模块,通过hub接的,串口号应该是28和30号,结果提示串口2,串口3插入,串口列表也没显示出任何串口号来.
绝对有bug,我用自己几年前写的串口升级工具都能识别出来.用别的串口精灵也能识别出来.
我的系统是win7,64位.所测试的芯片为pl2303

使用特权

评论回复
18
huangqi412| | 2015-7-6 11:18 | 只看该作者
mohanwei 发表于 2015-7-5 20:51
windows版本+正版/盗版/ghost+各种硬件+各种线+各种驱动……搭配出来的系统千差万别

08年的时候新配 ...

:lol:lol

使用特权

评论回复
19
huangqi412| | 2015-7-6 11:22 | 只看该作者
mohanwei 发表于 2015-7-5 20:51
windows版本+正版/盗版/ghost+各种硬件+各种线+各种驱动……搭配出来的系统千差万别

08年的时候新配 ...

:lol  不知道你的能不能打开虚拟串口,以及名字很长的串口(比如飞思卡尔板子上那个USB转串口,废卡的人脑子被驴踢了,非要在串口名字后面加上自己网址打广告,搞得一个串口名都快100个字节了估计,骂过几次也没反应),MCUISP的软件这两个打不开。  @mcuisp  能不能让你的串口助手可以打开虚拟串口和名字很长的串口。

使用特权

评论回复
20
mohanwei|  楼主 | 2015-7-6 11:43 | 只看该作者
奔牛滚滚 发表于 2015-7-5 21:53
软件有严重的bug,我的串口模块,通过hub接的,串口号应该是28和30号,结果提示串口2,串口3插入,串口列表也没 ...

身边的电脑只有xp和32位win7……64位win7还没用过,不过这个64位的向下兼容性问题是很多的。
当时找了不少资料,打开串口助手时获取串口列表的方法只看到一种,就是到注册表这个路径HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\SERIALCOMM\去枚举:

代码大体上也只有一种:
void ComPort::GetAllPortList(CString &sList)
{
    CString str;
    HKEY hKey;
    str=_T("HARDWARE\\DEVICEMAP\\SERIALCOMM");
    if(RegOpenKeyEx(HKEY_LOCAL_MACHINE, str,0,KEY_READ, &hKey) != ERROR_SUCCESS)
    {
        RegCloseKey( hKey );
        return ;
    }

    CHAR     achClass[MAX_PATH] = "";  // buffer for class name
    DWORD    cchClassName = MAX_PATH;  // size of class string
    DWORD    cSubKeys;                 // number of subkeys
    DWORD    cbMaxSubKey;              // longest subkey size
    DWORD    cchMaxClass;              // longest class string
    DWORD    cValues;              // number of values for key
    DWORD    cchMaxValue;          // longest value name
    DWORD    cbMaxValueData;       // longest value data
    DWORD    cbSecurityDescriptor; // size of security descriptor
    FILETIME ftLastWriteTime;      // last write time

    TCHAR  achValue[MAX_PATH];
    DWORD cchValue = MAX_PATH;
    BYTE  achBuff[80];
    DWORD chValue = 60;
    DWORD type = REG_SZ;
    // Get the class name and the value count.
    RegQueryInfoKey(hKey,        // key handle
        achClass,                // buffer for class name
        &cchClassName,           // size of class string
        NULL,                    // reserved
        &cSubKeys,               // number of subkeys
        &cbMaxSubKey,            // longest subkey size
        &cchMaxClass,            // longest class string
        &cValues,                // number of values for this key
        &cchMaxValue,            // longest value name
        &cbMaxValueData,         // longest value data
        &cbSecurityDescriptor,   // security descriptor
        &ftLastWriteTime);       // last write time

    if (cValues)
    {
        for (DWORD j = 0, retValue = ERROR_SUCCESS;
                j < cValues; j++)
        {
            chValue = 60;
            cchValue = 60;
            retValue = RegEnumValue(hKey, j, achValue,
                &cchValue,
                NULL,
                &type,    // &dwType,
                achBuff, // &bData,
                &chValue);   // &bcData
            if(retValue == ERROR_SUCCESS)
            {
                sList += CString(achBuff);
                m_Port.AddString(CString(achBuff));
            }
        }
    }

    RegCloseKey( hKey );
}

如果你的64位win7不是通过这种方式来存放当前串口列表,应该是读不出来的……等我有机会用上,才能看看有什么不一样……

关于插入/拔除时串口号的解析显示,是参考了一个codeproject上的一个例子,调用几个系统API:SetupDiGetDeviceInstanceId() SetupDiGetDeviceRegistryProperty() SetupDiGetDeviceRegistryProperty()来获取的,对这些API毫无研究……如果它们搞不定,我也搞不定:lol

使用特权

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

本版积分规则

个人签名:试一下能否设置签名档

177

主题

9320

帖子

24

粉丝