Работа с COM-портами в C#

Какую литературу можно почитать по работе с COM-портами в C#?
Сразу говорю: в Гугле искал, но там либо обратные послания в Гугл, либо тяжелые примеры, которые мне, как новичку, тяжело понять.

Підписуйтеся на Telegram-канал «DOU #tech», щоб не пропустити нові технічні статті

👍ПодобаєтьсяСподобалось0
До обраногоВ обраному0
LinkedIn
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter

На первой же странице гугла простые примеры. ivanp.ru/...ортами-в-net-c

Если вам для профессиональных целей, начните с изучения даташита на UART 16550, например от National Semiconductor, чтобы понимать работу на физическом уровне. Также поможет когда придется разбираться с RS485/422, которые зачастую используются вместо RS232 в промышленных применениях.

Из книжек есть неплохая Serial Port Complete от Jan Axelson, к слову женщины, которая похоже влюбилась в электронику :)

Из книжек есть неплохая Serial Port Complete от Jan Axelson, к слову женщины, которая похоже влюбилась в электронику :)

Только женщина могла даташит на 100 страниц развести на целых 380!

Если интересует фундаментальная работа с COM портом — нужно гуглить UART (universal asyncronious receiver — transmitter). Это — контроллер COM портов

Кратко для чайников:

1) На форму положим в визуальном дизайнере компонент SerialPort, или как его там
2) Параметры порта по умолчанию настраиваются такие: скорость — 9600, параметры порта 8N1 (8 бит, нет контроля четности, один стоповый бит). Управление потоком — аппаратное (CTS/RTS), есть еще программное (XON/XOFF) — но его использовать не следует.

3) Размер буфера для чайников — несколько байт (чтобы при заполнении срабатывало событие, на которое нужно подписаться)

Все это настраивается в дизайнере, подписывание на событие — там же. Все работает с первого раза.

А работа с COM портами на уровне Асма есть в замечательной книге вроде Абеля «Справочник программиста персональных компьютеров IBM PC, XT и AT», девяносто какого-то года :)

p.s. Надо подписаться на события вроде называются DataReceived, и StateChanged.

У SerialPort (или как его там) есть статический метод, который возвращает все доступные хэндлы портов в системе. Также, есть 2 полезных метода для работы с буфером, по памяти не помню их название: один — возвращает содержимое буфера, и его очищает. Второй — возвращает, но не очищает. В общем, ничего сложного. Даже получалось запросто мобилу соединить по виртуальному ком порту через блютус, и программа на C# управляла его встроенным GSM модемом через AT+ команды, которые посылались в виртуальный ком порт

Применять события или нет, зависит от протокола. Большинство протоколов, используемых через RS232, являются протоколами типа «запрос-ответ», и работают синхронно. Для них использование событий даже вредно, т.к. затрудняет диагностику потери связи с устройством. В таких случаях лучше делать отдельный поток для обработки запросов из очереди, для каждого запроса устанавливать таймаут (или использовать общий в SerialPort). Сами запросы при этом обрабатываются синхронно, с блокирующим ожиданием данных.

Применять события или нет, зависит от протокола. Большинство протоколов, используемых через RS232, являются протоколами типа «запрос-ответ», и работают синхронно.
Вы — про протоколы типа Kermit, ZModem? Так то — из другой оперы, а на события порта подписываться обязательно, если мы-не мазохисты, т.к. члены СериалПорт, которые не статические — пля не потокобезопасные. Также не забываем, что если сигнал идет через медленный и с помехами канал, то EndOfLine, EndOfStream и т.п. мы можем ждать довольно долго (если дождемся :)

Я про протоколы типа DCON и MODBUS, а также разные самописные. Потокобезопасность решается с помощью очереди, которая имеет монопольный доступ к порту, а объекты в очереди это команды, которые что-то пишут и читают. Команды уже можно добавлять из разных потоков, и ждать пока они завершатся. Ну тут можно много рассказывать, я на этом собаку съел.

Все же, кто знает литературу (учебники), в которых упоминается работа с COM-портами?

Кстати, MSDN как всегда какашки выдает. А именно:
1) Напишите ж вы (Микрософт) хоть раз, какие библиотеки используете!!!
2) На строке port = new SerialPort(); почему-то выдавало ошибку. При SerialPort port = new SerialPort(); все ок.
3) В примерах извне все банально просто: port.SetName = «COM1».
4) Откуда-то взялся необъявленная переменная _continue.
И еще много чего.

Там все слишком заморочено для новичка.

2) На строке port = new SerialPort(); почему-то выдавало ошибку. При SerialPort port = new SerialPort(); все ок.

А Вы думаете, что справедливо написали в профиле C#/.NET ?

В плане изучения, а не знаний. Могу убрать галочку, если Вам так будет лучше.

1) Напишите ж вы (Микрософт) хоть раз, какие библиотеки используете!!!

В мсдн написано:
Пространство имен: System.IO.Ports

Сборка: System (в System.dll)

Не нужно обижать мсдн. Это самое лучшее сборище доки. Попробуйте например почитать доку по макоси, или по линуксу...

2) На строке port = new SerialPort(); почему-то выдавало ошибку. При SerialPort port = new SerialPort(); все ок

помому что переменную нужно сначала обьявлять, а уже потом использовать.

4) Откуда-то взялся необъявленная переменная _continue.

нужно полностью копировать код примера. Она обьявлена в начале класса:
public class PortChat
{
static bool _continue;

static SerialPort _serialPort;

Думаю начинать изучения С# вам стоит с более простых примеров по книжкам.

Не нужно обижать мсдн. Это самое лучшее сборище доки. Попробуйте например почитать доку по макоси, или по линуксу...
Как сборище доков — норм, но мсдн — это не учебник.
В мсдн написано:
Пространство имен: System.IO.Ports
И ежу понятно :) Но там не упомянуты левые библиотеки, которые тоже используются. Потом трачу время на поиск нужного класса. Хотя, это не так существенно.
Она обьявлена в начале класса:

Оп! Спасибо!
Выражусь немного иначе:
Класс я уже создал. Мне нужен полный, детализированный разбор работы с COM-портами.

То есть, что-то на подобии 2-ой ссылки.

это дзен, недоступный с# програмистам без с/с++ бекграунда

доку по дотнету смотрел?
msdn.microsoft.com/...serialport.aspx
???

Там есть даже пример простого чата через компорт. Что в ней не понятно? Врядли в форуму лучше обьяснят.

поискал в гугле по “com port c#”

2-я ссылка:
“Welcome to my tutorial on Serial Port Communication in C#. ....”

www.dreamincode.net/...nication-in-c

3-я ссылка:
“SerialPort Class”

msdn.microsoft.com/...serialport.aspx

Что тут можно не понять и как должно быть, ещё проще? :)

я не помню нативной поддержки ком портов в дотнете (правда это было достаточно давно)
в общем там формально тот же самый файл (на уровне winapi), но с плюшками

так что рекомендую читать мсдн по винапи по работе с ком-портами, либо искать либку уже заточенную под это

я не помню нативной поддержки ком портов в дотнете (правда это было достаточно давно)

Есть там, это точно.

System.IO.Ports.SerialPort есть

еще есть FileStream через который можно девайс открыть как файл.

Підписатись на коментарі