1 votos

Cómo forzar el cierre / liberación de los puertos serie abiertos por otros programas en cmd o Powershell

Tras este post, puedo usar cmd's mode comando para ver la disposición / puertos libres. También puedo usar el PowerShell (PS) 's oneliner:

Get-WMIObject Win32_SerialPort | Select-Object DeviceID

para ver todos los puertos existentes. La diferencia indica el Abierto de disponibilidad de los puertos.

Ahora quiero interrumpir (forzar cierre) de los puertos que están abiertos en cualquier forma, incluidos los que se abren al exterior cmd/PS. Por favor, considere la posibilidad de

  1. El puerto no está necesariamente abierta dentro de PS. de lo contrario, podría utilizar $<PortName>.Close() a ello.
  2. Tiene que ser un cmd o comando PS no una interfaz gráfica de usuario solución de como editar el registro o la reformulación del sistema operativo.
  3. No quiero borrar o destruir el puerto. Sólo quiero para asegurarse de que están libres (listo para abrirse)
  4. Deben ser preferiblemente de una sola línea. Algo que se puede ejecutar en una sola línea. el uso de tuberías de aceptar.

P. S. también he publicado la pregunta aquí en Reddit

1voto

postanote Puntos 159

DevCon Reiniciar: Detiene y reinicia los dispositivos especificados. Válido sólo en el equipo local.

Ejemplo 38: Reiniciar un dispositivo

El siguiente comando utiliza el DevCon operación de Reinicio para reiniciar el adaptador de bucle invertido en el equipo local. El comando de los límites de la búsqueda para la configuración de Red de clase y, dentro de esa clase, especifica el dispositivo IDENTIFICADOR de instancia de que el adaptador de bucle invertido, de la RAÍZ*MSLOOP\0000. En el carácter (@) identifica la cadena como un IDENTIFICADOR de instancia de dispositivo. El carácter de comilla simple ('), que solicita un literal de búsqueda, impide DevCon de interpretación del asterisco en la IDENTIFICACIÓN como un comodín carácter.

devcon restart =net @'ROOT\*MSLOOP\0000

O de otro modo, profundizar en lo que está disponible y lo que usted puede tomar acción.

La comprensión de Escritura y Lectura de la información de los Puertos Serie

http://www.powertheshell.com/reference/wmireference/root/cimv2/Win32_SerialPort http://www.powertheshell.com/reference/wmireference/root/cimv2/Win32_SerialPort/Reset https://devblogs.microsoft.com/powershell/writing-and-reading-info-from-serial-ports

(Get-WMIObject Win32_SerialPort).DeviceID

# COM3

Get-CimClass -ClassName Win32_SerialPort | Format-List -Force

...
CimClassMethods     : {SetPowerState, Reset}
...

Métodos

El Win32_SerialPort clase tiene estos métodos.

Descripción Del Método

Reset No se implementan. Para implementar este método, ver el método Reset en CIM_SerialController.

SetPowerState No implementado. Para implementar este método, ver el SetPowerState método en CIM_SerialController.

https://docs.microsoft.com/en-us/windows/desktop/CIMWin32Prov/win32-serialport

Get-CimClass -ClassName CIM_LogicalDevice | Format-List -Force

Get-CimInstance -ClassName CIM_LogicalDevice | 
Where-Object -Property DeviceID -EQ $((Get-WMIObject Win32_SerialPort).DeviceID) | 
Select-Object -Property '*' | Get-Member

Get-CimInstance -ClassName CIM_LogicalDevice | 
Where-Object -Property DeviceID -EQ $((Get-WMIObject Win32_SerialPort).DeviceID) | 
Select-Object -Property TimeOfLastReset


# Writing to a Serial Port using .Net namespace accelerator

[System.IO.Ports.SerialPort]::getportnames()
COM3
$port = New-Object System.IO.Ports.SerialPort COM3,9600,None,8,one
$port.open()
$port.WriteLine("Hello world")
$port.Close()


# Reading from a Serial Port using .Net namespace accelerator
$port = New-Object System.IO.Ports.SerialPort COM3,9600,None,8,one
$port.Open()
$port.ReadLine()

0voto

Jamie Hanrahan Puntos 8474

\Device\Serialn , donde n se inicia en 0, son el dispositivo interno de los nombres de los puertos serie, y se maneja a estos que usted necesita para cerrar.

No va a ser una línea, pero ...

Descargar el "mango" de la utilidad de las herramientas de SysInternals.

Desde un símbolo del sistema elevado, ejecute handle device\serial >temp.txt

El archivo contendrá un montón de líneas de la forma:

image.exe pid: 24944 type: File 4C: \Device\Serialn

Para cada línea, ejecutar (como admin): handle -p <pid> -c <handleValue> -y

El último valor hexadecimal de cada línea de handle de salida (4C en el ejemplo mostrado) es el valor del identificador que usted desea. Así, por ejemplo, tendría que cerrar que gestionar a través de

handle -p 24944 -c 4c -y

EnMiMaquinaFunciona.com

EnMiMaquinaFunciona es una comunidad de administradores de sistemas en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros sysadmin, hacer tus propias preguntas o resolver las de los demás.

Powered by: