System.IO.Ports.SerialPort - IOCTL_SERIAL_SET_WAIT_MASK può essere configurato?

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

  •  06-07-2019
  •  | 
  •  

Domanda

Ho cercato di imparare un po 'su come .Net (3.5) interagisce con la porta seriale attraverso la classe System.IO.Ports.SerialPorts scrivendo una piccola applicazione Windows Form per raccogliere il chiamante visualizza i dati da un vecchio modem esterno.

Ho provato che il modem supporta la visualizzazione del chiamante; usando Putty o Hyperterminal posso configurare il modem per raccogliere i dati di visualizzazione del chiamante (usando il comando AT # CID = 1 , che ho trovato qui ) e quando il telefono squilla, i dati vengono visualizzati. Nella finestra del terminale, appare così:

RING

DATE = 0308
TIME = 2045
NMBR = 01234567890

RING

La mia applicazione C # sembra configurare correttamente il modem e visualizza un RING messaggio quando squilla il telefono; tuttavia, non visualizza mai i dati dell'ID chiamante.

Nel tentativo di capire perché, ho confrontato le azioni intraprese dai diversi client usando Sysinternals Portmon .

La differenza principale appare nella configurazione della connessione; la mia applicazione C # include la seguente riga, che Putty e Hyperterminal no;

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

A quanto ho capito, IOCTL_SERIAL_SET_WAIT_MASK è un elenco inclusivo di tipi di messaggi da filtrare.

Quindi, tre domande:

È possibile che le informazioni sull'ID chiamante vengano eliminate da IOCTL_SERIAL_SET_WAIT_MASK ?

In tal caso, come posso configurarlo per mostrare le informazioni sull'ID chiamante? Non sembra essere accessibile dalle proprietà della classe.

Se non riesco a configurarlo, è la mia unica opzione per aggirare questo per scrivere il mio wrapper alle funzioni di sistema di livello inferiore che controllano la porta seriale?

La mia comprensione delle comunicazioni della porta seriale è molto semplice, quindi mi aspetto di essere molto distante dalla mia diagnosi. Qualsiasi orientamento ricevuto con gratitudine.

È stato utile?

Soluzione

Ero fuori strada con la mia diagnosi.

Sembra che il metodo WriteLine non termini i comandi che invia con il terminatore di linea previsto dal mio modem.

Tutto quello che dovevo fare era aggiungere un ritorno a capo ai comandi che sto inviando e inviarli usando il metodo Scrivi .

Scuse per aver perso tempo a nessuno.

Altri suggerimenti

Ho trovato questo su MSDN che sembra un buon esempio di come accedere alla porta seriale tramite P / Invoke sulla DLL di sistema.

Vorrei ancora sapere se posso aggirare i miei problemi con la classe .Net.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top