System.IO.Ports.SerialPort - можно ли настроить IOCTL_SERIAL_SET_WAIT_MASK?
-
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.