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

STM32虚拟串口打开情况下被拔出,上位机软件怎么处理?

[复制链接]
jinghong21 提问时间:2016-12-29 09:01 /
我现在是能检测到虚拟串口被拔出的,不过现在需要串口再次插上去的时候,能够再次使用,这个就不好弄了,因为拔掉之前的串口状态是Open着的,串口再插上去不管你Open()还是Close()软件都会出问题!而且这种情况去操作,上位机软件经常出现崩溃闪退的现象!
有什么方法让上位机软件不闪退崩溃吗?
收藏 3 评论22 发布时间:2016-12-29 09:01

举报

22个回答
党国特派员 回答时间:2016-12-29 09:54:00
jinghong21 发表于 2016-12-29 09:34
我现在就是检测USB被插拔的,这些都没问题的!
  /// 检测USB串口的拔插
        ///

你明显是处理的不对。WM_DEVICECHANGE消息只是告诉你设备有变化,具体还要处理DBT_DEVICEQUERYREMOVE,DBT_DEVICEQUERYREMOVEFAILED,DBT_DEVICEREMOVEPENDING这几种情况。
你可以参考下:http://msdn.microsoft.com/en-us/library/aa363427(v=vs.85).aspx

评分

参与人数 1ST金币 +2 收起 理由
zero99 + 2

查看全部评分

jinghong21 回答时间:2016-12-29 09:34:23
本帖最后由 jinghong21 于 2016-12-29 09:37 编辑
党国特派员 发表于 2016-12-29 09:28
对虚拟串口要检测USB串口是否被拨掉消息的处理,具体参考windows消息WM_DEVICECHANGE  ...

      
我现在就是检测USB被插拔的,这些都没问题的!
  /// 检测USB串口的拔插
        /// </summary>
        /// <param name="m"></param>
        protected override void WndProc(ref Message m)
        {
            if (m.Msg ==  Detection.UsbSet.WM_DEVICE_CHANGE)        // 捕获USB设备的拔出消息WM_DEVICECHANGE
            {
                try
                {
                    comPort.Close();     //我怀疑闪退就是这一局导致的,因为comPort已经不存在了,去操作它导致软件崩溃的!                                               //可是,要是不加这一局comPort的状态就是Open,下一次USB再插进来,都不能操作comPort
                }
                catch { }
                if (Detection.GetComNum() != null)
                {
                    try
                    {
                        comPort.PortName = Detection.GetComNum();
                        comPort.BaudRate = Setting.ComSet.comBaudRate;
                        comPort.Open();
                        statusStrip1.BackColor = Color.Green;
                        toolStripStatusLabel1.Text = "Open " + comPort.PortName + " " + comPort.BaudRate.ToString();
                    }
                    catch
                    {
                        comPort.Close();
                        comPort.Open();
                    }
                }
                else
                {
                    comPort.Close();
                    statusStrip1.BackColor = Color.Red;
                    toolStripStatusLabel1.Text = "Close " + comPort.PortName + " " + comPort.BaudRate.ToString();
                }         
            }
            base.WndProc(ref m);
        }
andypanfan 回答时间:2016-12-29 09:13:12
有点深奥  没怎么看懂!!!
myfocus-2048857 回答时间:2016-12-29 09:13:29
虚拟串口,没玩过,听过
jackten 回答时间:2016-12-29 09:13:43
我也想知道                        
斜阳 回答时间:2016-12-29 09:21:58
这个涉及到操作系统层面了;好像没办法处理;应该是在拔之前close;

评分

参与人数 1ST金币 +2 收起 理由
zero99 + 2

查看全部评分

jinghong21 回答时间:2016-12-29 09:27:03
斜阳__ 发表于 2016-12-29 09:21
这个涉及到操作系统层面了;好像没办法处理;应该是在拔之前close;

你好,我在友善串口调试助手上面实验,是可以这样操作的,而且串口助手不会崩溃,它里面应该是做了处理。现在我只是想让软件不闪退,弹出对话框什么的都无所谓!
党国特派员 回答时间:2016-12-29 09:28:05
对虚拟串口要检测USB串口是否被拨掉消息的处理,具体参考windows消息WM_DEVICECHANGE
creep 回答时间:2016-12-29 09:48:42
应该不会崩溃吧,我们经常遇到是再次打开的时候会失败而已。

评分

参与人数 1ST金币 +2 收起 理由
zero99 + 2

查看全部评分

jinghong21 回答时间:2016-12-29 10:24:46
creep 发表于 2016-12-29 09:48
应该不会崩溃吧,我们经常遇到是再次打开的时候会失败而已。

是很奇怪,在Debug调试下就不会出现闪退的现象,直接打开exe就会出现闪退的现象!
jinghong21 回答时间:2016-12-29 10:25:59
党国特派员 发表于 2016-12-29 09:54
你明显是处理的不对。WM_DEVICECHANGE消息只是告诉你设备有变化,具体还要处理DBT_DEVICEQUERYREMOVE,DB ...

你好,这个没关系的。
我在  if (Detection.GetComNum() != null)  做了处理了!

就是有一个疑惑的地方,闪退的解决办法?
党国特派员 回答时间:2016-12-29 10:41:47
jinghong21 发表于 2016-12-29 10:25
你好,这个没关系的。
我在  if (Detection.GetComNum() != null)  做了处理了!

你再仔细看下,这是系统在拔掉USB之前,给你一个Close的机会。过了这个机会你再Close就要报错了。因为已经不存在要关闭的设备了。
jinghong21 回答时间:2016-12-29 11:11:09
党国特派员 发表于 2016-12-29 10:41
你再仔细看下,这是系统在拔掉USB之前,给你一个Close的机会。过了这个机会你再Close就要报错了。因为已 ...

switch (m.WParam.ToInt32())
这个值一直为7,不会等于DBT_DEVICEREMOVECOMPLETE或者DBT_DEVICEARRIVAL。
xiaoxiao0932 回答时间:2016-12-29 11:21:49
简单的处理是每次操作的时候重新扫描usb虚拟设备端口是否存在,当然用消息处理最合理

评分

参与人数 1ST金币 +2 收起 理由
zero99 + 2

查看全部评分

12下一页

所属标签

相似问题

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版