System.IO.Ports.SerialPort - pode IOCTL_SERIAL_SET_WAIT_MASK ser configurado?

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

  •  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.

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top