System.IO.Ports.SerialPort - можно ли настроить IOCTL_SERIAL_SET_WAIT_MASK?

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

  •  06-07-2019
  •  | 
  •  

Вопрос

Я пытался немного узнать о том, как .Net (3.5) взаимодействует с последовательным портом через System.IO.Ports.SerialPorts создайте класс, написав небольшое приложение Windows Forms для сбора данных отображения вызывающего абонента со старого внешнего модема.

Я проверил, что модем поддерживает отображение вызывающего абонента;используя Putty или Hyperterminal, я могу настроить модем на сбор данных отображения вызывающего абонента (используя команду AT#CID=1, который я нашел здесь), и когда звонит телефон, отображаются данные.В окне терминала это выглядит примерно так:

RING

DATE = 0308
TIME = 2045
NMBR = 01234567890

RING

Мое приложение на C #, похоже, успешно настроило модем и отображает RING сообщение, когда зазвонит телефон;однако он никогда не отображает данные идентификатора вызывающего абонента.

Пытаясь понять, почему это происходит, я сравнил действия, предпринятые разными клиентами, использующими Sysinternals Портмон.

Основное различие проявляется в конфигурации подключения;мое приложение на C # включает в себя следующую строку, которой нет в Putty и Hyperterminal;

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

Насколько я понимаю, это, IOCTL_SERIAL_SET_WAIT_MASK представляет собой всеобъемлющий список типов сообщений для фильтрации.

Итак, три вопроса:

Возможно ли, что информация об идентификаторе вызывающего абонента подавляется IOCTL_SERIAL_SET_WAIT_MASK?

Если да, то как я могу настроить его для отображения информации об идентификаторе вызывающего абонента?Похоже, что он недоступен из свойств класса.

Если я не могу это настроить, является ли мой единственный вариант обойти это, чтобы написать свою собственную оболочку для системных функций более низкого уровня, управляющих последовательным портом?

Мое понимание связи по последовательному порту очень простое, поэтому я ожидаю, что сильно ошибся в своем диагнозе.Любые указания принимаю с благодарностью.

Это было полезно?

Решение

Я сильно ошибся со своим диагнозом.

Кажется , что WriteLine метод не завершает команды, которые он отправляет, с помощью терминатора строки, который ожидает мой модем.

Все, что мне нужно было сделать, это добавить возврат каретки к командам, которые я отправляю, и отправлять их с помощью Write способ.

Приношу извинения за то, что отнял у кого-то время.

Другие советы

Я нашел это на MSDN, который выглядит как достойный пример того, как получить доступ к последовательному порту через P / Invoke в системной библиотеке dll.

Я все еще хотел бы знать, могу ли я обойти свои проблемы с классом .Net.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top