Оболочка C # / .NET для последовательного порта WIN32 Comm API - PullRequest
3 голосов
/ 23 июля 2010

Я ищу способ иметь как можно больше контроля над последовательным портом в моем приложении c #.Проблема в том, что мне нужно общаться с устройством, у которого нет документации, за исключением старой программы на С ++, написанной для управления им.Я пытался использовать класс SerialPort для связи с устройством, но его поведение довольно странное (мне приходится повторять некоторые команды, некоторые другие команды вообще не работают).Я хотел бы скопировать поведение этой неуправляемой программы, однако это представляется невозможным для класса serialport, поскольку он не обеспечивает доступа к низкоуровневым функциям и структурам, таким как, например, DCB.Оболочки для последовательной связи доступны для .net?Может быть, я мог бы использовать отражение, чтобы манипулировать недоступными членами serialport во время выполнения?

Ответы [ 5 ]

5 голосов
/ 22 августа 2014

Для тех, кто предлагает взглянуть на класс .NET SerialPort; Бен Фойгт (Ben Voigt), частый поставщик ответов на вопросы о переполнении стека, дает отличную информацию о том, почему обертка вокруг WinAPI в конечном итоге окажется гораздо лучшей идеей, чем использование инфраструктуры, предоставляемой SerialPort:

Бен Фойгт на .NET SerialPort

А должен читать.

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

Также, по-видимому, существует по крайней мере одно коммерческое решение, обеспечивающее запрошенную функциональность здесь .

Другое редактирование:

Еще один поиск в Интернете привел к этому сообщению в блоге , по-видимому, со времени, когда в .NET не было класса SerialPort ... Предоставляется исходный код, показывающий, как обернуть Win32 API для этой цели.

EDIT

Некоторые пользователи отмечают, что вышеупомянутая ссылка на сообщение в блоге MSDN не работает.

Название связанной статьи было:

" Использование P / Invoke для разработки библиотеки базовых классов .NET для связи с последовательными устройствами ", написанной Джоном Хиндом и опубликованной в октябре 2002 года, как я могу сказать из другой статьи MSDN, ссылающейся на нее:

enter image description here

К сожалению, Microsoft, похоже, обслуживает только редакции своего журнала вплоть до 2003 года:

https://msdn.microsoft.com/en-us/magazine/msdn-magazine-issues.aspx

FWIW, я нашел наполовину работающую онлайн-версию в другом месте ...

3 голосов
/ 23 июля 2010

Класс SerialPort - это очень тонкая оболочка для API-интерфейса последовательного порта Win32, трудно понять, как другая оболочка может улучшить вашу жизнь.Начиная с .NET 1.x дней доступны обертки, не поддерживающие последовательные порты.Вот один из MSDN magazine .

Но у вас точно такие же проблемы.Один из способов, которым записанные команды могут быть потеряны, - это устройство, выбрасывающее принятые байты (или теряющее их), когда оно отключило сигнал RTS.Вы исправите это, установив для свойства Handshake значение RequestToSend.

Один из способов, с помощью которых можно ошибиться при чтении команд, состоит в неправильном вызове Read ().Он вернет произвольное количество байтов, столько, сколько доступно в приемном буфере.Обратите внимание на возвращаемое значение, оно говорит вам, сколько байтов было фактически прочитано.Единственная гарантия состоит в том, что она будет по крайней мере 1 и никогда не будет превышать count .

Утилита SysInternals PortMon может помочь вам устранить неполадки связи, она даетсырое представление о том, что видит драйвер устройства.Сравните, скажем, с Hyperterminal или другой заведомо хорошей программой.

3 голосов
/ 23 июля 2010

К сожалению, класс SerialPort является неполной оболочкой.Я обнаружил, что единственный способ получить доступ к базовому DCB - это отражение.

Единственный другой вариант - переписать SerialPort и завершить его.Я не видел ни одной такой свободно доступной реализации (пока).

Вот пример, где я использовал отражение, чтобы получить доступ к RTS_CONTROL_TOGGLE: http://social.msdn.microsoft.com/Forums/en-US/csharpgeneral/thread/45a89532-b01c-4ef8-aa46-532882cec004

2 голосов
/ 27 августа 2014

Работа с последовательным портом через PInvoke работает нормально.Мы делаем это в приложении Silverlight, но оно должно работать так же в обычном приложении .NET.Ответ на Последовательная связь с Silverlight 5 (COM-порт) предоставляет базовую оболочку для, которую можно легко адаптировать к вашим потребностям.Он использует обычный метод WinAPI, поэтому вы получаете полный доступ ко всем функциям последовательного порта, как в случае приложения C ++.

PS Если вы этого еще не сделали, используйте PortMon для мониторингапроисходит на линии.

0 голосов
/ 23 июля 2010

Возможно, вы сможете скопировать старый код C ++ в управляемый класс C ++, который затем сможете использовать, как и любой обычный класс .NET, из вашего кода C #.Это может быть самый быстрый способ достичь своей цели.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...