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

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管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版