Runbook · POS MS-DOS en VirtualBox · Ubuntu host

COM3 en la VM del POS

Mover la impresora USB del COM1 al COM3 del guest, liberar COM1 y COM2 para dispositivos seriales físicos, y sumar el adaptador USB-RS232 como COM4. Sin tocar posusb6.py.

Cableado objetivo
Guest MS-DOS · rsdrvx4
VirtualBox · Puertos serie
Host Ubuntu
COM13F8h · IRQ 4
Puerto 1Dispositivo anfitrión
/dev/ttyS0serial físico 1
COM22F8h · IRQ 3
Puerto 2Dispositivo anfitrión
/dev/ttyS1serial físico 2
COM33E8h · IRQ 5 (o 7)
Puerto 3Tubería anfitrión · cliente
/tmp/vbox_serial_pipeposusb6.py → impresora USB
COM42E8h · IRQ 7 (o 5)
Puerto 4Dispositivo anfitrión
/dev/ttyUSB0adaptador USB-RS232

Por qué fallaba al agregar COM3

El driver serial del POS es RSDRVX, y su fuente está en libsp/RSDRV. Ahí están las tres causas reales. Ninguna es VirtualBox.

Corre rsdrvx2, no rsdrvx4

AUTOEXEC.BAT carga rsdrvx2.exe, compilado con MAXCOM 2. El tercer puerto se ignora en silencio. La línea de rsdrvx4 está comentada con REM.

COM3 sin IRQ pisa a COM1

La IRQ por defecto es 4 salvo para COM2. Un COM3 sin :irq reemplaza el vector de COM1 con su propio handler, y COM1 deja de recibir sin ningún mensaje.

La base de E/S viene de la BIOS

RS232::open lee la dirección del puerto en 0040:0000. Si la BIOS de la VM no detectó el puerto al arrancar, la base es 0 y open falla.

Pasos

  1. Host y guest · con la VM todavía encendida

    Elegir una IRQ libre para COM3

    En una VM las IRQ son las que VirtualBox emula, no las del Ubuntu físico. El driver solo acepta 3, 4, 5 y 7. COM1 y COM2 ya usan 4 y 3, así que a COM3 le queda 5 o 7, la que esté libre.

    IRQQuién la ocupa en VirtualBoxCómo liberarla
    5Audio SoundBlaster 16, si está habilitadoConfiguración → Audio → deshabilitar. Un POS no lo usa.
    7Puerto paralelo LPT1, si está habilitadoConfiguración → Puertos paralelos → deshabilitar, salvo que el POS imprima por paralelo.

    Desde el host:

    VBoxManage showvminfo "NOMBRE_VM" | grep -iE "audio|lpt|parallel|uart"

    Desde DOS, leer la máscara del controlador de interrupciones. Un bit en 1 significa que nadie habilitó esa IRQ.

    C:\>debug
    -i 21
    B8                ; 1011 1000 → bits 7 y 5 en 1: IRQ 7 e IRQ 5 libres
    -q
    Decisión

    Esta guía usa IRQ 5 para COM3 y IRQ 7 para COM4. Si IRQ 5 está tomada, invertir: COM3 en 7 y COM4 en 5. Lo que elijas acá se repite igual en VirtualBox y en AUTOEXEC.BAT. Si las dos están tomadas y no se pueden liberar, hay que resignar COM4.

  2. Host · VirtualBox

    Apagar la VM por completo

    Los puertos serie solo se editan con la VM apagada. Un estado guardado o pausado no alcanza.

  3. Host · VirtualBox · Configuración → Puertos serie

    Configurar las cuatro pestañas

    Para COM3 y COM4 elegir Definido por el usuario en "Número de puerto". Los presets COM3 y COM4 fijan IRQ 4 y 3 y no dejan cambiarla. Las IRQ de la tabla son las del paso 1; si elegiste 7 para COM3, cargá 7 acá y 5 en COM4.

    PestañaNúmero de puertoIRQE/SModoRuta
    Puerto 1COM143F8Dispositivo anfitrión/dev/ttyS0
    Puerto 2COM232F8Dispositivo anfitrión/dev/ttyS1
    Puerto 3Definido por el usuario53E8Tubería anfitrión/tmp/vbox_serial_pipe
    Puerto 4Definido por el usuario72E8Dispositivo anfitrión/dev/ttyUSB0
    Puerto 3

    Tildar "Conectar a tubería/socket existente". Eso es el modo cliente. posusb6.py ya crea el socket con bind y listen; si VirtualBox también lo crea, los dos pelean por el mismo archivo.

    Equivalente por línea de comandos:

    VBoxManage modifyvm "NOMBRE_VM" \
      --uart1 0x3F8 4 --uartmode1 /dev/ttyS0 \
      --uart2 0x2F8 3 --uartmode2 /dev/ttyS1 \
      --uart3 0x3E8 5 --uartmode3 client /tmp/vbox_serial_pipe \
      --uart4 0x2E8 7 --uartmode4 /dev/ttyUSB0
    
    VBoxManage showvminfo "NOMBRE_VM" | grep -i uart
  4. Host · Ubuntu

    Verificar el lado host antes de arrancar

    El servicio tiene que estar corriendo para que el socket exista, y el usuario que lanza VirtualBox necesita permiso sobre los puertos físicos.

    systemctl status posusb6
    ls -l /tmp/vbox_serial_pipe          # srw-rw---- root dialout
    ls -l /dev/ttyS0 /dev/ttyS1 /dev/ttyUSB0
    id -nG $USER | grep -w dialout       # si no aparece: sudo usermod -aG dialout $USER
  5. Guest · MS-DOS · antes de cargar el driver

    Confirmar que la BIOS registró los cuatro puertos

    Arrancar la VM y, antes del AUTOEXEC o con el driver aún sin cargar, leer la tabla de puertos serie de la BIOS Data Area.

    C:\>debug
    -d 40:0 L8
    0040:0000  F8 03 F8 02 E8 03 E8 02
    -q
    F8 03COM1 · 03F8h
    F8 02COM2 · 02F8h
    E8 03COM3 · 03E8h
    E8 02COM4 · 02E8h

    Cada par es una dirección little-endian. Un par en 00 00 significa que ese puerto no está habilitado en VirtualBox, y el driver va a fallar en ese unit.

  6. Guest · MS-DOS · C:\AUTOEXEC.BAT

    Cargar rsdrvx4 con IRQ explícita por puerto

    Reemplazar la línea de rsdrvx2 por rsdrvx4. La sintaxis es puerto:irq. Conservar b: y p: tal como estaban.

    rem antes
    c:\pcpos\rsdrvx2.exe b:1 1:4 2:3
    
    rem después, COM3 en IRQ 5
    lh c:\pcpos\rsdrvx4.exe b:1 1:4 2:3 3:5 4:7
    
    rem alternativa, COM3 en IRQ 7
    lh c:\pcpos\rsdrvx4.exe b:1 1:4 2:3 3:7 4:5
    Regla

    La IRQ es un solo dígito y el driver solo toca el PIC master. Valen 3, 4, 5 y 7. IRQ 10 u 11 no existen para este driver. La IRQ de cada puerto tiene que ser la misma que cargaste en VirtualBox.

  7. Guest y host

    Verificar el circuito completo

    Al cargar, el driver imprime una línea por cada puerto que abrió. Tiene que aparecer la de COM3 con IRQ 5.

    Balanza KRETZ
    Open COM1 IRQ4
    Open COM2 IRQ3
    Open COM3 IRQ5
    Open COM4 IRQ7

    Después, imprimir un ticket desde el POS y mirar el tráfico del lado host:

    tail -f /var/log/posusb6.log
    Listo

    Si el log muestra los bytes ESC/POS y el ticket sale, COM3 está funcionando. posusb6.py no necesita ningún cambio: solo ve el socket, no sabe qué COM del guest le escribe.

Si algo no anda

SíntomaCausa probableQué hacer
No aparece "Open COM3"Puerto 3 deshabilitado en la VM, o base 0 en la BDARepetir el paso 4. Revisar que Puerto 3 esté habilitado y en E/S 3E8.
COM3 anda pero COM1 dejó de recibirCOM3 quedó en IRQ 4 y pisó el vector de COM1Poner 3:5 en AUTOEXEC y IRQ 5 en Puerto 3 de VirtualBox. Ambos lados.
Solo abre dos puertosSigue cargando rsdrvx2.exeCambiar a rsdrvx4.exe. Verificar que el .exe exista en C:\PCPOS.
La VM no arranca, error de pipeSocket ausente, servicio posusb6 caídosystemctl restart posusb6 y confirmar que /tmp/vbox_serial_pipe existe.
Error de permisos en /dev/ttyS0 o ttyUSB0Usuario de VirtualBox fuera del grupo dialoutsudo usermod -aG dialout $USER, cerrar sesión y volver a entrar.
Nada llega a la impresoraPuerto 3 en modo servidor, no clienteTildar "Conectar a tubería/socket existente" en Puerto 3.
COM3 o COM4 recibe basura o se cuelgaIRQ compartida con audio SB16 o con LPT1Volver al paso 1. Deshabilitar audio o paralelo en la VM, o cambiar la IRQ de ese COM a la que quedó libre.
Impresora paralela dejó de andarIRQ 7 ocupada por un COMMover ese COM a IRQ 5 si está libre. Si 5 y 7 están tomadas, hay que resignar un puerto serie.

Reglas del driver que conviene tener a mano

Sintaxisrsdrvx4.exe [p:n] [b:n] puerto:irq ... con puerto 1 a 4.
IRQ por defecto4 para todos, 3 para COM2. Siempre indicarla explícita en COM3 y COM4.
Base de E/SLeída de 0040:0000. El driver no prueba direcciones por su cuenta.
IRQ válidasUn dígito, PIC master. En la práctica 3, 4, 5, 7.
Balanzab:0 OMRON, b:1 KRETZ, b:2 Mettler-Toledo, b:3 Hasar.
DebugPrefijo - antes de los argumentos activa el modo debug del driver.