你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32 USB虚拟串口 死掉的问题

[复制链接]
sanx 提问时间:2014-12-19 14:40 /
大家都说STM32 USB的虚拟串口有问题, 只要PC端串口打开着, 然后拔掉USB, 再插上USB的时候就打不开串口, 就拔掉USB以后在PC端没有彻底关闭掉串口, 造成再插上的时候也是认为是串口已经在打开状态。
对比CH340和CP2102等 都没有这种问题, 把问题归结于ST提供的PC端虚拟串口驱动, 然后发邮件给ST咨询, ST说: 我们的驱动是没有问题的, 是串口助手的问题。
彻底失望, 人家340、2102等都没有问题, 就你有问题, 怎么把问题归结于串口助手呢, 怎么能说出这么不负责任的话呢? 我们的产品中其它问题都能解决, 就是解决不了这个问题。
失望ST官方能够正视并且尽量解决这个问题, 那真的是广大开发者的福音
收藏 1 评论40 发布时间:2014-12-19 14:40

举报

40个回答
sanx 最优答案 回答时间:2015-1-6 10:17:14
把问题重申一次:
1、USB 在串口助手打开的时候拔掉, 此时如果串口助手没有关闭刚才的com口, 重新插上USB就会出现USB端口永远被占用的情况, 只能重启电脑解决;
2、在部分“克隆版”的系统中无法安装 ST的虚拟串口驱动, 估计系统被裁剪太多了;
3、情况助手我们不是不能开发,但是就是要要求客户只能用我们的串口助手了, 并且还要安装.NET才能解决问题“1”, 而我们的原则是不对客户进行太多的要求, 尽量少安装、普通串口助手也能使用;
4、很多童鞋说“这是USB本身的问题”, 那么CH340、CP2102怎么就不存在这些问题呢?难道人家不是USB?
wjandsq 回答时间:2014-12-24 14:35:15
本帖最后由 wjandsq 于 2014-12-25 21:07 编辑

【原创】计算机中USB串口列表、友好名称及端点号的查找方法
一、获得计算机的串口列表,一般用两种方法:

1. 循环法 1-256, 用Windows API一个个打开,返回不存在信息的删掉,其它保留。
   这个方法很笨,但确定都是正确的。

2. 查询注册表,得到串口列表。
   这个方法很快,但有时不正确(可能会多,只多不少)。

   例如超级终端打开,占用了一个USB串口,你不关闭超级终端,但把USB串口强行拔掉。
   这时用查询注册表的方法,得到的串口列表,仍然包括已经不存在的USB串口。

   修正的方法也简单,再次使用windows API依次打开列表中的串口,发现不存在,更新下列表。


二、STM32组成的USB多路串口中设备端点号的搜索

   现在我们要掌握USB转多路串口的端点号,以便清楚地了解当前使用的STM32,是用哪个串口和
   外面的设备通讯的。这里我们安排的USB端点号和物理串口的对应关系如下:
   MI_00 <--> USART1
   MI_02 <--> USART2
   MI_04 <--> USART3

   STM32的多路串口对应的串口号是变化的,但3个端点号不会变。我们想要在上位机软件中找到诸如
   MI_00此类的信息,就要另外想办法。

   想要得到串口的具体信息,是比较麻烦的,以往程序员都采用根据设备GUID的特征进行查询,
   我发现用这个方法特别不靠谱,例如上面的串口列表,就发现了错误。

   端点信息的查询也是个麻烦事。参考Windows API相关的书,找到枚举设备的函数,
   枚举所有存在的设备,串口相关的信息如下:

(标准端口类型)
通信端口 (COM1)
通信端口 (COM1)
\Device\00000083

ELTIMA Software
ELTIMA Virtual Serial Port (COM2->COM3)
Eltima Virtual Serial Bus
\Device\00000092

ELTIMA Software
ELTIMA Virtual Serial Port (COM3->COM2)
Eltima Virtual Serial Bus
\Device\00000093

STMicroelectronics Virtual COM Port
USB\VID_0483&PID_5740&REV_0200&MI_00
USB\Class_02&SubClass_02&Prot_01
USB\Class_02&SubClass_02&Prot_01

STMicroelectronics.
STMicroelectronics Virtual COM Port (COM70)
0000.001d.0000.001.005.000.000.000.000
\Device\0000009c


  我们发现,在搜索到" STMicroelectronics Virtual COM Port "字符串时,下一行的信息是
   "USB\VID_0483&PID_5740&REV_0200&MI_00",可以根据这个信息,打开注册表,枚举这个
  注册表分支下键值的名称,友好名称的键值字符串是"STMicroelectronics Virtual COM Port (COM70)",
  然后我们分析下这个串口友好名称里的串口号,把这个串口号和实时串口列表中的号码匹配,如果一致,
  就可以确认MI_00是这个串口的端点。到此,任务完毕。

  如果只是搜索到" STMicroelectronics Virtual COM Port (COM70) "字符串,则不能确认MI_00就一定
  是它的端点号,因为其它USB设备也有可能使用MI_00,这里只能是根据MI_00信息打开注册表,
  匹配到友好名称及端口号,才可以确认MI_00就是该USB串口实际所使用的端点。

  这个功能会在以后新版本的USB Serial Tools软件中提供。

  备注: USB Serial Tools 自2012年启动开发,迄今为止,一直在成长。



wuzhujian 回答时间:2015-1-5 11:35:41
USB转串口,毕竟不是真正的串口,是“虚拟”的。
从机理上讲,硬件串口,不管串口线是否连接,硬件始终是于电脑相连的,是可以与电脑通信的,串口的驱动程序是一直工作的。
而USB转串口,一但USB线拨掉,该串口已经不存在系统中了,系统分配给该串口的资源,就已经被回收给系统了,打开串口时返回的句柄,已经是个废句柄了(它指向的资料已经被系统释放了)。
楼主的问题,既不是ST的问题,也不是微软的问题,USB工作机理的问题。
解决的办法是:
接收USB改变的消息,一但发生USB 设备改变,就对该消息进行判断,是不是你所打开的串口被拨出或插上了。
所以,早期编写的串口助手,并不完全适合于USB转串口这种情况。
废鱼 回答时间:2014-12-19 15:09:51
楼主用的哪个串口工具?把串口工具关了,再打开也提示这个吗?串口显示的是串口几?
wamcncn 回答时间:2014-12-19 20:44:45
楼主的意思是使用虚拟串口,拔USB之前要关PC端串口,不关拔掉再插上USB,串口不能用?
咱﹑旳青春 回答时间:2014-12-22 10:47:21
我在使用 340 的时候, 发现, 一拔出USB 串口就自动关闭了,  你下次插上一定要重新打开串口的, 否则没戏, 我觉得这应该是串口助手软件的功能吧,
wjandsq 回答时间:2014-12-22 11:28:57
打电话给微软,人家也会说是你的问题,驱动是微软做的,这些小问题。肯定不是ST或者微软的问题。因为我的STM32做的USB转3串口用的好好的。
晓枫VS枯叶 回答时间:2014-12-22 12:07:48
楼主,串口没这么容易挂掉的吧,可能是串口助手上的串口号不能自动刷新,如果是串口运行的过程中拔掉了,有可能导致电脑蓝屏或死机(被2102搞了几次)。
arm8686 回答时间:2014-12-22 15:46:34
晓枫VS枯叶 发表于 2014-12-22 12:07
楼主,串口没这么容易挂掉的吧,可能是串口助手上的串口号不能自动刷新,如果是串口运行的过程中拔掉了,有 ...

没被折腾到蓝屏,但是串口助手软件会死掉。

如果点击关闭串口之后再拔 USB 线,则没有问题。
wjandsq 回答时间:2014-12-22 16:47:31
注册Windows消息,如果有USB设备拔出,则释放资源,这是串口工具应该做到的。
奔跑小蜗牛 回答时间:2014-12-23 09:06:58
     各式各样的串口助手一大堆,不可能保证都是高手写出来的高质量的软件,我用过这么多,突然拔掉串口线,会出现各种各样的奇葩问题,总结一下:
1.正如你说的,串口助手没反应,仍然是显示串口打开状态
2.拔掉后,不停地弹出错误窗口,关都关不掉,只能任务管理器结束
3.拔掉后,电脑卡死或者软件卡死转圈圈
4.拔掉后电脑蓝屏
5.拔掉后串口助手突然消失

ST毕竟是大厂,大厂的东西还是可以值得信赖的,还是多从自身找找问题吧。
wamcncn 回答时间:2014-12-23 10:00:00
实际测试了下串口助手,在拔掉USB后,再插上USB,虽然串口助手显示的是串口打开,但不工作,必须关掉串口再打开,串口助手才正常工作
小贾-370388 回答时间:2014-12-23 14:19:15
这个应该跟st的硬件没有关系主要是跟驱动有关系
废鱼 回答时间:2014-12-25 10:50:04
wjandsq 发表于 2014-12-24 14:35
一、获得计算机的串口列表,一般用两种方法:

1. 循环法 1-256, 用Windows API一个个打开,返回不存在信息 ...

不用的,.NET可以直接读取到串口列表的。
AndyYau-268557 回答时间:2014-12-26 15:35:13
未遇见上述问题。建议还是从串口助手入手查找。如果是st硬件问题话,就不会现在只有你才发现。
沐紫 回答时间:2014-12-30 10:52:08
楼主哪去了呢?问题解决了不
123下一页

所属标签

相似问题

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版