STM32/STM8技术论坛
直播中

云达贞

8年用户 939经验值
私信 关注
[问答]

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

我现在是能检测到虚拟串口被拔出的,不过现在需要串口再次插上去的时候,能够再次使用,这个就不好弄了,因为拔掉之前的串口状态是Open着的,串口再插上去不管你Open()还是Close()软件都会出问题!而且这种情况去操作,上位机软件经常出现崩溃闪退的现象!
有什么方法让上位机软件不闪退崩溃吗?

回帖(22)

李刚

2018-11-16 09:05:21

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

潘小旋

2018-11-16 09:17:16
有点深奥  没怎么看懂!!!
举报

屈鑫燕

2018-11-16 09:23:26
虚拟串口,没玩过,听过
举报

尹聪

2018-11-16 09:41:49
我也想知道                        
举报

甘璐妲

2018-11-16 09:53:21
这个涉及到操作系统层面了;好像没办法处理;应该是在拔之前close;
举报

云达贞

2018-11-16 10:09:15
引用: youpukeji668 发表于 2018-11-16 10:10
这个涉及到操作系统层面了;好像没办法处理;应该是在拔之前close;

你好,我在友善串口调试助手上面实验,是可以这样操作的,而且串口助手不会崩溃,它里面应该是做了处理。现在我只是想让软件不闪退,弹出对话框什么的都无所谓!
举报

李刚

2018-11-16 10:14:32
对虚拟串口要检测USB串口是否被拨掉消息的处理,具体参考windows消息WM_DEVICECHANGE
举报

云达贞

2018-11-16 10:30:43
引用: 你我然后 发表于 2018-11-16 10:32
对虚拟串口要检测USB串口是否被拨掉消息的处理,具体参考windows消息WM_DEVICECHANGE

本帖最后由 jinghong21 于 2016-12-29 09:37 编辑

      
我现在就是检测USB***拔的,这些都没问题的!
  /// 检测USB串口的拔插
        ///
        ///
        protected override void WndProc(ref Message m)
        {
            if (m.Msg ==  Detection.U***Set.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);
        }
举报

张倩

2018-11-16 10:37:26
应该不会崩溃吧,我们经常遇到是再次打开的时候会失败而已。
举报

云达贞

2018-11-16 10:55:17
引用: 亲爱的娜娜 发表于 2018-11-16 10:54
应该不会崩溃吧,我们经常遇到是再次打开的时候会失败而已。

是很奇怪,在Debug调试下就不会出现闪退的现象,直接打开exe就会出现闪退的现象!
举报

云达贞

2018-11-16 11:12:43
引用: 你我然后 发表于 2018-11-16 09:22
你明显是处理的不对。WM_DEVICECHANGE消息只是告诉你设备有变化,具体还要处理DBT_DEVICEQUERYREMOVE,DBT_DEVICEQUERYREMOVEFAILED,DBT_DEVICEREMOVEPENDING这几种情况。
你可以参考下:https://msdn.microsoft.com/en-us/library/aa363427(v=vs.85).aspx

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

就是有一个疑惑的地方,闪退的解决办法?
举报

李刚

2018-11-16 11:19:02
引用: tianyu5655 发表于 2018-11-16 11:30
你好,这个没关系的。
我在  if (Detection.GetComNum() != null)  做了处理了!

你再仔细看下,这是系统在拔掉USB之前,给你一个Close的机会。过了这个机会你再Close就要报错了。因为已经不存在要关闭的设备了。
举报

云达贞

2018-11-16 11:33:48
引用: 你我然后 发表于 2018-11-16 11:36
你再仔细看下,这是系统在拔掉USB之前,给你一个Close的机会。过了这个机会你再Close就要报错了。因为已经不存在要关闭的设备了。

switch (m.WParam.ToInt32())
这个值一直为7,不会等于DBT_DEVICEREMOVECOMPLETE或者DBT_DEVICEARRIVAL。
举报

杜永强

2018-11-16 11:50:46
简单的处理是每次操作的时候重新扫描u***虚拟设备端口是否存在,当然用消息处理最合理
举报

云达贞

2018-11-16 11:58:47
而且有一个奇怪的现象,Debug模式下面怎么操作都不会崩溃闪退,只有在bin下面的exe文件下面才会有闪退的现象!
举报

陈利妮

2018-11-16 12:11:54
这个我也遇到,看看有什么办法没
举报

池鹄展

2018-11-16 12:29:18
10楼正解呀
举报

刘超

2018-11-16 12:37:59
举报

余婧

2018-11-16 12:49:39
支持热插拔?
举报

更多回帖

发帖
×
20
完善资料,
赚取积分