System.IO.Ports.SerialPort - IOCTL_SERIAL_SET_WAIT_MASK può essere configurato?
-
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.
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.