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

时间:2014-04-09 18:28:20

标签: windows serial-port usb driver putty

我有一个嵌入式控件,它使用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进行交互

编辑:以下是a link来自Microsoft的信息,解释了上述内容。我没有运气确定哪个更改对我的应用程序有效,所以我可能会使用不同的ErrorControl和StartType开始试错(虽然从我读到的内容,我几乎不怀疑它们会解决我的问题)

1 个答案:

答案 0 :(得分:0)

刚才意识到我从来没有为此发布过答案。事实证明这是我无法解决的USB虚拟COM驱动程序的问题,但我能够提出这项工作。

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

Microsoft提供了一个名为devcon.exe的程序。它是Windows设备控制台,是一种命令行版本的设备管理器。

Ultimatlely,一旦我发现我可以移除设备并重新扫描(没有拔掉它,所以“虚拟”拔掉它),我意识到我可以打电话给这个应用程序为我删除特定的设备然后如果我检测到断开连接,则重新扫描设备结构。所以这里是我用来在转储串行数据之间完成此操作的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