Работа с COM-портами в C#
Какую литературу можно почитать по работе с COM-портами в C#?
Сразу говорю: в Гугле искал, но там либо обратные послания в Гугл, либо тяжелые примеры, которые мне, как новичку, тяжело понять.
Какую литературу можно почитать по работе с COM-портами в 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, или как его там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-портами?
Там все слишком заморочено для новичка.
2) На строке port = new SerialPort(); почему-то выдавало ошибку. При SerialPort port = new SerialPort(); все ок.
А Вы думаете, что справедливо написали в профиле C#/.NET ?
В плане изучения, а не знаний. Могу убрать галочку, если Вам так будет лучше.
В мсдн написано:1) Напишите ж вы (Микрософт) хоть раз, какие библиотеки используете!!!
Сборка: System (в System.dll)
Не нужно обижать мсдн. Это самое лучшее сборище доки. Попробуйте например почитать доку по макоси, или по линуксу...
2) На строке port = new SerialPort(); почему-то выдавало ошибку. При SerialPort port = new SerialPort(); все ок
помому что переменную нужно сначала обьявлять, а уже потом использовать.
нужно полностью копировать код примера. Она обьявлена в начале класса:4) Откуда-то взялся необъявленная переменная _continue.
static SerialPort _serialPort;
Думаю начинать изучения С# вам стоит с более простых примеров по книжкам.
Не нужно обижать мсдн. Это самое лучшее сборище доки. Попробуйте например почитать доку по макоси, или по линуксу...Как сборище доков — норм, но мсдн — это не учебник.
В мсдн написано:И ежу понятно :) Но там не упомянуты левые библиотеки, которые тоже используются. Потом трачу время на поиск нужного класса. Хотя, это не так существенно.
Пространство имен: System.IO.Ports
Она обьявлена в начале класса:
То есть, что-то на подобии
-
Там есть даже пример простого чата через компорт. Что в ней не понятно? Врядли в форуму лучше обьяснят.
поискал в гугле по “com port c#”
www.dreamincode.net/...nication-in-c
msdn.microsoft.com/...serialport.aspx
Что тут можно не понять и как должно быть, ещё проще? :)
так что рекомендую читать мсдн по винапи по работе с ком-портами, либо искать либку уже заточенную под это
я не помню нативной поддержки ком портов в дотнете (правда это было достаточно давно)
Есть там, это точно.
еще есть FileStream через который можно девайс открыть как файл.
-
22 коментарі
Додати коментар Підписатись на коментаріВідписатись від коментарів