handshake serialport что это

Рукопожатие последовательного порта. Какая разница между аппаратным и None handshaking?

Похоже, что в обоих случаях я должен контролировать сигналы RTS/CTS (только что проверил это на одном устройстве COM). Так в чем же разница между открытием последовательного порта с помощью аппаратного подтверждения и без подтверждения?

Еще один вопрос. Можем ли мы работать without handshaking только в режиме full duplex

2 ответа

Как вы, наверное, знаете, проблема заключается в «управлении потоком». Как в песне Clash «Должен ли я остаться или мне идти?».

Эта ссылка может объяснить более подробно:

Я подозреваю, что когда вы спрашивали о «рукопожатии» в отношении «дуплекса», возможно, вы имели в виду следующее:

В более старых версиях спецификации RS-232 использует RTS и Линии CTS асимметричны: DTE утверждает RTS, чтобы указать на желание передавать в DCE, и DCE утверждает CTS в ответ на предоставление разрешение. Это позволяет полудуплексные модемы, которые отключают их передатчики, когда не требуется, и должны передавать синхронизацию преамбула к получателю, когда они снова включены.

«Надеюсь, это поможет!

Разница больше в том, будет ли ядро ​​обращать внимание на CTS / RTS при принятии решения, отправлять больше данных или нет. С включенным аппаратным подтверждением связи оно будет. Если для него задано значение none, оно не будет отображаться, даже если CTS / RTS могут оставаться утвержденными, так что узел будет знать, что он может отправлять данные.

Источник

Handshake serialport что это

Эта статья показывает, как записывать и читать данные от устройства, подключенного к последовательному порту (COM-порт) из приложения на языке C# в среде .NET. Мы будем читать и записывать данные через TextBox на форме, и будем работать с потоками.

Для приема данных нам нужно создать обработчик события EventHandler для «SerialDataReceivedEventHandler»:

Вы можете также установить другие опции, такие как ReadTimeout и WriteTimeout (таймауты чтения и записи):

Как только Вы готовы использовать последовательный порт, Вам нужно открыть его:

Мы создадим теперь метод «sp_DataReceived», который будет выполнен при поступлении данных в последовательный порт:

Теперь создадим наш метод «si_DataReceived»:

Мы можем теперь принять данные из последовательного порта от устройства и отобразить их на форме. Некоторые устройства отправляют данные сами, без запроса. Однако некоторым устройствам нужно отправить определенные команды, чтобы они ответили на них какими-то своими данными. Для этих устройств Вы будете записывать данные в последовательный порт, и будете использовать предыдущий код, чтобы получить данные обратно. В этом примере будет происходить обмен со шкалой. Для отдельной шкалы отправка команды «SI\r\n» приведет к возврату веса, который имеется на шкале. Эта команда является специфической именно для этого устройства, в Вашем же случае нужно читать документацию по протоколу устройства, чтобы найти команды, принимаемые устройством. Для записи в последовательный порт создайте кнопку «Start» на форме, и добавьте код в событие клика на ней Click_Event:

Это все, что нужно Вам сделать. См. ссылку [1] для загрузки готового проекта Microsoft Visual C# 2010.

[Как передавать по одному символу, с задержкой]

В случае, когда нужно реализовать обмен с устройством, рассчитанным на взамодействие с пользователем (управляющая консоль). Так как пользователь вводит символы команды медленно, устройство успевает принять все символы и обработать. Если передавать символы быстро (методом SerialPort.Write), по несколько байт, то есть риск потери данных. Во врезке ниже приведен пример класса COMdevice, где реализован метод Write, который передает символы через задержку.

[Как перекодировать символы ANSI в UTF8]

Очень часть устройства на микроконтроллерах передают русские символы в кодировке ANSI (Windows-1251). Однако среда разработки Visual Studio C# хранит и обрабатывает русскоязычный текст в кодировке UTF8, и при попытке отобразить принятый текст (методом ReadExisting) выводятся кракозябры.

Решить проблему можно, если организовать байтовый буфер, и перекодировать массив байт с помощью класса Encoding (методом GetEncoding(1251).GetString). Пример кода в классе COMdevice приведен во врезке ниже.

[Ссылки]

Комментарии

[quote name=»Владимир»]Не очень шарю в С/С++/С#. При запуске этого приложения выдает ошибку в textbox «Порт ‘COM1’ не существует.» Всё подключено в порт COM4. В Вашем приложении не предлагается выбор портов в ComboBox1, список пуст. Подскажите в чем может быть проблема.

Читайте также:  какой индекс по этому адресу почтовый индекс

Источник

Serial Port Класс

Определение

Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.

Представляет ресурс последовательного порта.

Примеры

В следующем примере кода показано использование SerialPort класса, чтобы два пользователя могли общаться с двух отдельных компьютеров, Соединенных нуль-модемным кабелем. В этом примере пользователям предлагается ввести параметры порта и имя пользователя перед разговором. Для обеспечения полной функциональности этого примера оба компьютера должны выполнять программу.

Комментарии

Используйте этот класс для управления файловым ресурсом последовательного порта. Этот класс обеспечивает синхронный и управляемый событиями ввод-вывод, доступ к состояниям ПИН-кода и прерываний, а также доступ к свойствам последовательного драйвера. Кроме того, функциональные возможности этого класса могут быть заключены во внутренний Stream объект, доступны через BaseStream свойство и переданы в классы, которые переносятся в оболочку или используют потоки.

GetPortNamesМетод используется для получения допустимых портов для текущего компьютера.

Если SerialPort объект блокируется во время операции чтения, не прерывайте поток. Вместо этого закройте базовый поток или удалите SerialPort объект.

Конструкторы

Инициализирует новый экземпляр класса SerialPort.

Инициализирует новый экземпляр класса SerialPort, используя указанный объект IContainer.

Инициализирует новый экземпляр класса SerialPort, используя указанное имя порта.

Инициализирует новый экземпляр класса SerialPort, используя указанное имя порта и скорость передачи в бодах.

Инициализирует новый экземпляр класса SerialPort, используя указанное имя порта, скорость передачи в бодах и бит четности.

Инициализирует новый экземпляр класса SerialPort, используя указанное имя порта, скорость передачи в бодах, бит четности и биты данных.

Инициализирует новый экземпляр класса SerialPort, используя указанное имя порта, скорость передачи в бодах, бит четности, биты данных и стоп-бит.

Указывает, что отсчет времени ожидания не производится.

Свойства

Возвращает базовый объект Stream для объекта SerialPort.

Возвращает или задает скорость передачи для последовательного порта (в бодах).

Получает или задает состояние сигнала разрыва.

Возвращает число байтов данных, находящихся в буфере приема.

Получает число байтов данных, находящихся в буфере отправки.

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

Получает состояние линии обнаружения несущей для порта.

Возвращает объект IContainer, который содержит коллекцию Component.

Возвращает состояние линии готовности к приему.

Возвращает или задает стандартное число битов данных в байте.

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

Возвращает или задает значение, показывающее, игнорируются ли пустые байты (NULL), передаваемые между портом и буфером приема.

Получает или задает состояние сигнала готовности данных (DSR).

Получает или задает значение, включающее поддержку сигнала готовности терминала (DTR) в сеансе последовательной связи.

Получает или задает кодировку байтов для преобразования текста до и после передачи.

Возвращает список обработчиков событий, которые прикреплены к этому объекту Component.

Возвращает или задает протокол установления связи для передачи данных через последовательный порт с использованием значения Handshake.

Возвращает значение, указывающее открытое или закрытое состояние объекта SerialPort.

Возвращает или задает значение, используемое для интерпретации окончания вызова методов ReadLine() и WriteLine(String).

Возвращает или задает протокол контроля четности.

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

Получает или задает последовательный порт, в частности, любой из доступных портов COM.

Возвращает или задает размер входного буфера SerialPort.

Получает или задает срок ожидания в миллисекундах для завершения операции чтения.

Возвращает или задает число байтов во внутреннем входном буфере до возникновения события DataReceived.

Возвращает или задает значение, показывающее, включен ли сигнал запроса передачи (RTS) в сеансе последовательной связи.

Получает или задает ISite объекта Component.

Получает или задает стандартное число стоповых битов в байте.

Возвращает или задает размер выходного буфера последовательного порта.

Получает или задает срок ожидания в миллисекундах для завершения операции записи.

Методы

Закрывает соединение порта, присваивает свойству IsOpen значение false и уничтожает внутренний объект Stream.

Создает объект, который содержит всю необходимую информацию для создания прокси-сервера, используемого для взаимодействия с удаленным объектом.

Читайте также:  что делать если зуб красный

Удаляет данные из буфера приема последовательного драйвера.

Удаляет данные из буфера передачи последовательного драйвера.

Освобождает все ресурсы, занятые модулем Component.

Освобождает неуправляемые ресурсы, используемые объектом SerialPort, а при необходимости освобождает также управляемые ресурсы.

Определяет, равен ли указанный объект текущему объекту.

Служит хэш-функцией по умолчанию.

Извлекает объект обслуживания во время существования, который управляет политикой времени существования данного экземпляра.

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

Возвращает объект, представляющий службу, предоставляемую классом Component или классом Container.

Возвращает объект Type для текущего экземпляра.

Получает объект службы времени существования для управления политикой времени существования для этого экземпляра.

Создает неполную копию текущего объекта Object.

Создает неполную копию текущего объекта MarshalByRefObject.

Открывает новое соединение последовательного порта.

Считывает из входного буфера SerialPort определенное число байтов и записывает их в байтовый массив, начиная с указанной позиции.

Считывает из входного буфера SerialPort определенное число символов и записывает их в символьный массив, начиная с указанной позиции.

Считывает из входного буфера SerialPort один байт в синхронном режиме.

Считывает из входного буфера SerialPort один символ в синхронном режиме.

Считывает все непосредственно доступные байты в соответствии с кодировкой из потока и из входного буфера объекта SerialPort.

Считывает данные из входного буфера до значения NewLine.

Возвращает объект String, содержащий имя Component, если оно есть. Этот метод не следует переопределять.

Записывает указанное число байтов в последовательный порт, используя данные из буфера.

Записывает указанное число символов в последовательный порт, используя данные из буфера.

Записывает указанную строку в последовательный порт.

Записывает указанную строку и значение NewLine в выходной буфер.

События

Указывает, что данные были получены через порт, представленный объектом SerialPort.

Возникает при удалении компонента путем вызова метода Dispose().

Указывает, что произошла ошибка с портом, представленным объектом SerialPort.

Указывает, что для порта, представленного объектом SerialPort, возникло событие сигнала, не связанного с данными.

Источник

Работа с Arduino из C# приложения

Делать это можно без использования сторонних библиотек. Фактически, используя только виртуальный COM порт.

Давайте сначала напишем скетч для Arduino. Мы будем отправлять на порт строку с текстом, содержащим в себе значение переменной, которая у нас будет постоянно изменятся в цикле (таким образом имитируя данные снятые с датчика). Также будем считывать данные с порта и в случае если получим текст «1», то включим встроенный в плату светодиод. Он расположен на 13-ом пине и помечен на плате латинской буквой L. А если получим «0», то выключим его.

WPF приложение

Теперь создадим WPF приложение. Разметку сделаем довольно простой. 2 кнопки и метка для отображения текста полученного с порта это все что необходимо:

Добавим 2 пространства имен:

И в области видимости класса 2 переменные с делегатом:

Реализуем событие Window_Loaded. В нем мы пройдемся по всем доступным портам, прослушаем их и проверим не выводится ли портом сообщение с текстом «Info from Arduino». Если найдем порт отправляющий такое сообщение, то значит нашли порт Arduino. В таком случае можно установить его параметры, открыть порт и запустить таймер.

Для снятия данных с порта и сравнения их с искомыми я использовал функцию ArduinoDetected:

Теперь осталось реализовать обработку события таймера. Метод OnTimedEvent можно сгенерировать средствами Intellisense. Его содержимое будет таким:

Мы считываем значение с порта и выводим его в виде текста метки. Но так как таймер у нас работает в потоке отличном от потока UI, то нам необходимо использовать Dispatcher.BeginInvoke. Вот здесь нам и пригодился объявленный в начале кода делегат.

После окончания работы с портом очень желательно его закрыть. Но так как мы работаем с ним постоянно, пока приложение открыто, то закрыть его логично при закрытии приложения. Добавим в наше окно обработку события Closing:

Готово. Теперь осталось сделать отправку на порт сообщения с текстом «1» или «0», в зависимости от нажатия кнопки и можно тестировать работу приложения. Это просто:

Получившийся пример доступен на GitHub.

Читайте также:  какой массы груз нужно подвесить на коротком плече рычага в точке а рис 100

Кстати, WinForms приложение создается еще быстрее и проще. Достаточно перетянуть на форму из панели инструментов элемент SerialPort (при наличии желания можно перетянуть из панели инструментов и элемент Timer). После чего в нужном месте кода, можно открыть порт, считывать из него данные и писать в него примерно как и в WPF приложении.

UWP приложение

Для того чтобы разобраться с тем как работать с последовательным портом я рассмотрел следующий пример: SerialSample
Для разрешения работы с COM портом в манифесте приложения должно быть такое вот объявление:

В коде C# нам понадобятся 4 пространства имен:

И одна переменная в области видимости класса:

При загрузке считаем в нее значение id порта к которому подключена плата Arduino:

Следующий Task считает 64 байта с порта и отобразит текст в поле с именем txtPortData

В UWP приложениях на C# отсутствует метод SerialPort.DiscardInBuffer. Поэтому один из вариантов, это считывать данные открывая каждый раз порт заново, что и было продемонстрировано в данном случае. Если вы попробуете, то сможете заметить, что отсчет каждый раз идет с единицы. Примерно то же самое происходит и в Arduino IDE при открытии Serial Monitor. Вариант, конечно, так себе. Открывать каждый раз порт это не дело, но если данные необходимо считывать редко, то этот способ сойдет. Кроме того, таким образом записанный пример выглядит короче и понятнее.

Рекомендуемый вариант это не объявлять каждый раз порт заново, а объявить его один раз, например, при загрузке. Но в таком случае необходимо будет регулярно считывать данные с порта, чтобы он не заполнялся старьем и данные оказывались актуальными. Смотрите как это сделано в моем примере UWP приложения. Я так полагаю, что концепт отсутствия возможности очистить буфер состоит в том, что постоянно асинхронно снимаемые данные, не особо нагружают систему. Как только необходимое количество байт считывается в буфер, выполняется следом написанный код. Есть плюс, в том, что при таком постоянном мониторинге ничего не пропустишь, но некоторым (и мне в том числе) не хватает привычной возможности один раз «считнуть» данные.

Для записи данных в порт можно использовать схожий код:

В результате я пришел к выводу, что работа в UWP с Arduino напрямую через виртуальный COM порт хоть и непривычна, но вполне возможна и без подключения сторонних библиотек.
Замечу, что Microsoft довольно тесно сотрудничает с Arduino, поэтому различных библиотек и технологий коммуникации, упрощающих разработку, множество. Самая популярная, это конечно же работающая с протоколом Firmata библиотека Windows Remote Arduino.

Источник

Serial Port Конструкторы

Определение

Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.

Инициализирует новый экземпляр класса SerialPort.

Перегрузки

Инициализирует новый экземпляр класса SerialPort.

Инициализирует новый экземпляр класса SerialPort, используя указанный объект IContainer.

Инициализирует новый экземпляр класса SerialPort, используя указанное имя порта.

Инициализирует новый экземпляр класса SerialPort, используя указанное имя порта и скорость передачи в бодах.

Инициализирует новый экземпляр класса SerialPort, используя указанное имя порта, скорость передачи в бодах и бит четности.

Инициализирует новый экземпляр класса SerialPort, используя указанное имя порта, скорость передачи в бодах, бит четности и биты данных.

Инициализирует новый экземпляр класса SerialPort, используя указанное имя порта, скорость передачи в бодах, бит четности, биты данных и стоп-бит.

SerialPort()

Инициализирует новый экземпляр класса SerialPort.

Примеры

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

Комментарии

Этот конструктор использует значения свойств по умолчанию, если ни одно из них не указано. Например, DataBits свойство по умолчанию равно 8, Parity свойство по умолчанию имеет None значение перечисления, StopBits свойство по умолчанию равно 1 и имя порта COM1 по умолчанию.

Источник

Сказочный портал