es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Lote de Windows. Coloca los datos del puerto serie en una variable.

Tengo un hardware (controlador de batería) que envía el voltaje de la batería a través de un puerto serial. Es solo un valor de 4 dígitos + carácter de fin de línea (‘1232\r\n’) cada 5 segundos.
Necesito leer ese valor y, si está por debajo de un umbral, apagar la PC. Es una máquina antigua con Windows XP en la que solo se me permite usar CMD sin crear archivos temporales.

En mi PC de casa, he creado un entorno de prueba con dos puertos virtuales (utilizando la utilidad com2com) y un script de PowerShell que emula el hardware:

cls
$port = New-Object System.IO.Ports.SerialPort
$port.PortName = "COM4"
$port.open()
while (1) {
$port.Write("1000"+[char]13+[char]10)
$port.close()
Start-Sleep -Seconds 5
$port.open()
}

El script anterior debe recibir los datos y apagar la PC si el valor está por debajo del umbral. Pero no funciona.

@ ECHO OFF
MODE COM5 BAUD=9600 PARITY=n DATA=8 > nul
set tr=1100
FOR /F "usebackq" %%i IN (`TYPE COM5`) DO set x=%%i
IF %x% lss %tr% (ECHO El sistema se apagará
rem shutdown /s
)

Cuando ejecuto el script, simplemente se queda esperando eternamente.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Solución para leer el voltaje de la batería a través de un puerto serial y apagar la PC basado en un umbral en CMD

    Para resolver este problema, necesitamos hacer algunas modificaciones al código existente. Aquí tienes una guía paso a paso:

    1. Configurar la comunicación del puerto serial

    Para leer el voltaje de la batería enviado a través del puerto serial, primero debemos configurar la comunicación. Ejecuta el siguiente comando en CMD:

    MODE COM5 BAUD=9600 PARITY=n DATA=8
    

    Esto establece los parámetros de comunicación para el puerto serial. Asegúrate de reemplazar COM5 con el nombre correcto del puerto para tu configuración.

    1. Leer los datos del puerto serial

    Luego, debemos leer los datos enviados a través del puerto serial. Podemos usar el comando set /p para leer los datos y almacenarlos en una variable. Aquí tienes el código actualizado:

    set /p data=<com5 ```="" esto="" lee="" una="" línea="" de="" datos="" del="" puerto="" serial="" y="" la="" almacena="" en="" la="" variable="" `data`.="" 3.="" verificar="" el="" valor="" del="" voltaje="" el="" valor="" del="" voltaje="" enviado="" a="" través="" del="" puerto="" serial="" es="" un="" valor="" de="" 4="" dígitos="" seguido="" de="" un="" carácter="" de="" nueva="" línea="" (`\r\n`).="" podemos="" extraer="" el="" valor="" del="" voltaje="" usando="" el="" comando="" `set`="" y="" algunas="" manipulaciones="" de="" cadena.="" aquí="" tienes="" el="" código:="" ```="" set="" voltage="%data:~0,4%" ```="" esto="" extrae="" los="" primeros="" 4="" caracteres="" de="" la="" variable="" `data`="" y="" los="" almacena="" en="" la="" variable="" `voltage`.="" 4.="" comparar="" el="" valor="" del="" voltaje="" con="" el="" umbral="" ahora="" que="" tenemos="" el="" valor="" del="" voltaje,="" podemos="" compararlo="" con="" el="" valor="" del="" umbral="" usando="" la="" declaración="" `if`.="" aquí="" tienes="" el="" código:="" ```="" if="" %voltage%="" lss="" %tr%="" (="" echo="" el="" sistema="" se="" apagará="" rem="" shutdown="" s="" )="" ```="" esto="" verifica="" si="" la="" variable="" `voltage`="" es="" menor="" que="" el="" valor="" del="" umbral="" `tr`.="" si="" lo="" es,="" muestra="" un="" mensaje="" y="" apaga="" el="" sistema="" (descomenta="" el="" comando="" `shutdown`="" para="" habilitarlo).="" 5.="" juntar="" todo="" aquí="" tienes="" el="" código="" final="" que="" junta="" todo:="" ```="" @echo="" off="" mode="" com5="" baud="9600" parity="n" data="8"> nul
    set tr=1100
    
    :loop
    set /p data=<com5
    set voltage=%data:~0,4%
    if %voltage% lss %tr% (
        echo el sistema se apagará
        rem shutdown /s
    )
    goto loop
    

    este código lee el valor del voltaje del puerto serial cada 5 segundos (basado en el intervalo de envío del hardware) y verifica si está por debajo del valor de umbral. si lo está, apaga el sistema.

    nota: dado que el controlador de hardware no está conectado a la computadora, el código no recibirá ningún dato y el script esperará indefinidamente. para probar el script, debes conectar el controlador de hardware a la computadora y asegurarte de que envíe datos cada 5 segundos. set=”” voltage=”%data:~0,4%” if=”” %voltage%=”” lss=”” %tr%=”” (=”” echo=”” el=”” sistema=”” se=”” apagará=”” rem=”” shutdown=”” s=”” )=”” goto=”” loop=”” ="" este="" código="" lee="" el="" valor="" del="" voltaje="" del="" puerto="" serial="" cada="" 5="" segundos="" (basado="" en="" el="" intervalo="" de="" envío="" del="" hardware)="" y="" verifica="" si="" está="" por="" debajo="" del="" valor="" de="" umbral.="" si="" lo="" está,="" apaga="" el="" sistema.="" nota:="" dado="" que="" el="" controlador="" de="" hardware="" no="" está="" conectado="" a="" la="" computadora,="" el="" código="" no="" recibirá="" ningún="" dato="" y="" el="" script="" esperará="" indefinidamente.="" para="" probar="" el="" script,="" debes="" conectar="" el="" controlador="" de="" hardware="" a="" la="" computadora="" y="" asegurarte="" de="" que="" envíe="" datos="" cada="" 5=""></com5
    set voltage=%data:~0,4%
    if %voltage% lss %tr% (
    echo el sistema se apagará
    rem shutdown /s
    )
    goto loop

    este código lee el valor del voltaje del puerto serial cada 5 segundos (basado en el intervalo de envío del hardware) y verifica si está por debajo del valor de umbral. si lo está, apaga el sistema.

    nota: dado que el controlador de hardware no está conectado a la computadora, el código no recibirá ningún dato y el script esperará indefinidamente. para probar el script, debes conectar el controlador de hardware a la computadora y asegurarte de que envíe datos cada 5 segundos.>

Comments are closed.