System.IO.Ports.SerialPort: ¿se puede configurar IOCTL_SERIAL_SET_WAIT_MASK?

StackOverflow https://stackoverflow.com/questions/628161

  •  06-07-2019
  •  | 
  •  

Pregunta

He intentado aprender un poco sobre cómo .Net (3.5) interactúa con el puerto serie a través de la clase System.IO.Ports.SerialPorts escribiendo una pequeña aplicación de formularios Windows Forms para reunir la persona que llama muestra datos de un módem externo antiguo.

He probado que el módem admite la pantalla de la persona que llama; usando Putty o Hyperterminal, puedo configurar el módem para recopilar datos de la persona que llama (usando el comando AT # CID = 1 , que encontré aquí ), y cuando suena el teléfono, se muestran los datos. En la ventana de terminal, se ve así:

RING

DATE = 0308
TIME = 2045
NMBR = 01234567890

RING

Mi aplicación C # parece configurar correctamente el módem y muestra un RING mensaje cuando suena el teléfono; sin embargo, nunca muestra los datos del identificador de llamadas.

En un esfuerzo por entender por qué esto es así, comparé las acciones tomadas por los diferentes clientes que usan Sysinternals Portmon .

La diferencia principal aparece en la configuración de la conexión; mi aplicación C # incluye la siguiente línea, que Putty e Hyperterminal no incluyen;

0.00000307  callerID.exe    IOCTL_SERIAL_SET_WAIT_MASK  Serial0 SUCCESS Mask: RXCHAR RXFLAG CTS DSR RLSD BRK ERR RING   

Según tengo entendido, IOCTL_SERIAL_SET_WAIT_MASK es una lista inclusiva de tipos de mensajes para filtrar.

Entonces, tres preguntas:

¿Es posible que IOCTL_SERIAL_SET_WAIT_MASK suprima la información del identificador de llamadas?

Si es así, ¿cómo puedo configurarlo para mostrar la información del identificador de llamadas? No parece ser accesible desde las propiedades de la clase.

Si no puedo configurarlo, ¿es mi única opción evitar esto para escribir mi propio contenedor en las funciones del sistema de nivel inferior que controlan el puerto serie?

Mi comprensión de las comunicaciones de puerto serie es muy básica, por lo que espero estar lejos de mi diagnóstico. Cualquier orientación recibida con gratitud.

¿Fue útil?

Solución

Estaba lejos con mi diagnóstico.

Parece que el método WriteLine no termina los comandos que envía con el terminador de línea que espera mi módem.

Todo lo que tenía que hacer era agregar un retorno de carro a los comandos que estaba enviando y enviarlos usando el método Write .

Disculpas por perder el tiempo de nadie.

Otros consejos

Encontré this en MSDN, que parece un buen ejemplo de cómo acceder al puerto serie a través de P / Invoke en los dll del sistema.

Todavía me gustaría saber si puedo solucionar mis problemas con la clase .Net.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top