Windows 通过重新启动使USB虚拟COM设备持久化

Windows 通过重新启动使USB虚拟COM设备持久化,windows,serial-port,usb,driver,putty,Windows,Serial Port,Usb,Driver,Putty,我有一个嵌入式控件,使用STM32微控制器,它使用USB端口作为“虚拟COM端口”与计算机通信。我目前正在运行一个循环测试,其中控件自动循环打开5分钟,关闭10秒。这是为了捕捉每50-200次重新启动就会出现的错误 设备已通过虚拟COM端口输出调试消息,但当设备重新启动时,USB设备断开连接并重新连接。然后,我用来监视输出的任何程序(putty、Tera Term等)都会失去连接,我必须手动拔下并重新插入USB电缆,然后重新启动我正在使用的任何COM应用程序 我的目标是设置Tera Term或p

我有一个嵌入式控件,使用STM32微控制器,它使用USB端口作为“虚拟COM端口”与计算机通信。我目前正在运行一个循环测试,其中控件自动循环打开5分钟,关闭10秒。这是为了捕捉每50-200次重新启动就会出现的错误

设备已通过虚拟COM端口输出调试消息,但当设备重新启动时,USB设备断开连接并重新连接。然后,我用来监视输出的任何程序(putty、Tera Term等)都会失去连接,我必须手动拔下并重新插入USB电缆,然后重新启动我正在使用的任何COM应用程序

我的目标是设置Tera Term或putty以保持COM端口打开,并将整个会话写入日志文件,但由于重新启动,USB设备不会持久

是否有任何方法可以“虚拟化”USB端口或修改.ini文件以使USB端口持久化?下面是我认为是.ini文件的相关部分

[USBtoSer.nt.Services] 
AddService=usbser, 0x00000002, DriverService

[DriverService] 
DisplayName=%USBIOMport% 
ServiceType=1
StartType=3
ErrorControl=1
ServiceBinary=%12%\usbser.sys 
我无法修改STM32上运行的嵌入式应用程序,只能通过USB通过预编程终端与之交互


编辑:以下是来自微软的信息,解释了上述功能。我还没能确定哪一个更改适用于我的应用程序,所以我可能会用不同的错误控制和启动类型开始尝试和出错(尽管从我所读到的内容来看,我毫不怀疑他们会解决我的问题)

刚刚意识到我从未发布过这方面的答案。原来这是一个USB虚拟COM驱动程序的问题,我无法解决,但我能够想出这个解决办法

注意:此问题和答案是特定于Windows平台的

微软提供了一个名为。它是Windows设备控制台,类似于设备管理器的命令行版本

最后,一旦我发现我可以移除设备并重新扫描(无需拔下它,所以有点“实际上”拔下它),我意识到我可以调用此应用程序为我移除特定设备,然后在检测到断开连接时重新扫描设备结构。下面是我用来在转储串行数据之间完成这项工作的python代码段。可能不是有史以来最干净的代码,但这只是一个快速而肮脏的日志脚本。希望这能帮助你们中的一些人遇到同样的问题

import serial
from subprocess import call
from time import sleep

def remove(ser):
    try:
        ser.close()
    except:
        print "Could not close port"
    call(["devcon.exe","remove","USB\VID_0D59&PID_0005*"])

def rescan():
    call(["devcon.exe","rescan"])
    sleep(30)

def send(ser, message):
    if ser.isOpen():
        try:
            ser.write(message)
        except serial.serialutil.SerialException:
            remove(ser)
            rescan()
            try:
                ser.open()
            except serial.serialutil.SerialException:
                try:
                    remove(ser)
                    rescan()
                except:
                    print 'Could not reconnect'
                    return False
            else:
                print 'Reconnected to %s' % (ser.portstr)
                ser.write(message)
                return True
        else:
            return True
重要提示:尝试向端口发送数据,然后接收异常是告知设备已重新启动的唯一方法。在这个驱动程序中,没有多少打开、关闭或检查连接被证明是成功的,所以这是当时我能想到的最好的解决方案

另外,请注意
rescan()
函数中的任意30秒延迟。这是为了让计算机有足够的时间识别设备并找到合适的驱动程序。时间因系统和设备而异

此代码段是Python 2


最后,这可能是显而易见的,但此解决方案在同一目录或路径中有
devcon.exe
PATH

,因为您必须使用其他人编写的终端,没有您自己的更改,也没有对嵌入式代码进行任何更改,所以此问题根本没有编程组件。你可以试试超级用户。谢谢@BenVoigt的推荐,我可以这么做。我当然不必使用不同的终端,我可以自己编写,但这仍然不能解决设备非持久性的问题。您是否建议我编写自己的程序以保持主动轮询USB端口?如果您编写自己的程序,您可以处理与设备删除相关的操作系统事件并关闭端口。然后,当设备返回时,它将找不到它的首选端口,并将其回收。你也会得到一个设备连接事件,表明又到了打开端口的时候了。谢谢@BenVoigt,我想可能有一种方法可以通过编程实现,我只是在寻找一个简单的解决方案,而不必使用我自己的串行记录器。如果我在超级用户方面运气不好,我可能会回到这里问另一个问题:-)