System.IO.Ports.SerialPort - pode IOCTL_SERIAL_SET_WAIT_MASK ser configurado?
-
06-07-2019 - |
Pergunta
Eu venho tentando aprender um pouco sobre como .Net (3.5) interage com a porta serial através da classe System.IO.Ports.SerialPorts
escrevendo um pequeno aplicativo do Windows Forms para coletar dados de exibição de chamadas a partir de um modem externo de idade.
Eu testei que o visor suporta modem chamador; usando Putty ou Hyperterminal posso configurar o modem para exibir dados de chamadas a cobrar (usando o AT#CID=1
comando, que eu encontrei aqui ), e quando o telefone toca, os dados são exibidos. Na janela de terminal, ele se parece com isso:
RING
DATE = 0308
TIME = 2045
NMBR = 01234567890
RING
Meu C # aplicação parece configurar com êxito o modem e exibe uma RING
mensagem quando o telefone toca; no entanto, nunca exibe os dados de identificação de chamada.
Em um esforço para entender por que isso é, eu comparei as ações tomadas pelos diferentes clientes usando Sysinternals Portmon .
A principal diferença aparece na configuração da conexão; meu C # aplicação inclui a seguinte linha, que Putty e Hyperterminal não;
0.00000307 callerID.exe IOCTL_SERIAL_SET_WAIT_MASK Serial0 SUCCESS Mask: RXCHAR RXFLAG CTS DSR RLSD BRK ERR RING
Pelo que entendi, IOCTL_SERIAL_SET_WAIT_MASK
é uma lista inclusiva de tipos de mensagens para filtrar.
Assim, três perguntas:
É possível que as informações de identificação do chamador está sendo suprimida por IOCTL_SERIAL_SET_WAIT_MASK
?
Se sim, como posso configurá-lo para mostrar a informação de identificação de chamadas? Não parece ser acessível a partir das propriedades da classe.
Se eu não posso configurá-lo, é minha única opção para contornar este problema de escrever meu próprio wrapper para as funções do sistema de nível inferior que controlam a porta serial?
O meu entendimento de comunicações de porta serial é muito básico, por isso espero que eu estou longe de meu diagnóstico. Qualquer orientação recebidas com gratidão.
Solução
Eu estava longe com meu diagnóstico.
Parece que o método WriteLine
não terminar os comandos que envia com o terminador de linha meu modem está esperando.
Tudo que eu precisava fazer era adicionar um retorno de carro aos comandos estou enviando, e enviá-los usando o método Write
.
Desculpas para desperdiçar o tempo de ninguém.
Outras dicas
este no MSDN que parece um exemplo decente de como acessar a porta serial via P / Invoke na DLL do sistema.
Eu ainda gostaria de saber se eu posso obter em torno de meus problemas com a classe .Net.