Работа с RS-232 портом в C#
Привет, друзья программеры! Сейчас популярный в новых компьютерах USB, а СОМ – порта давно не наблюдалось. Тем не менее, устройства использующие СОМ – порт не остались в стороне. Они поддерживаются производителями и не потеряли популярности на производствах. Где нужен обмен информацией между различными современными устройствами (сбор информации, контроль управления). Как известно, разъем USB не совместим с СОМ или RS-232 аппаратно. Среди компьютерных комплектующих продаются конвертеры USB2.0 TO RS232. А вот так выглядит конвертер без упаковки.

Конвертер USB 2.0 - RS-232
В Windows определяется как СОМ – порт. На рисунке показан конвертер в Диспетчере устройств.

Подключенный USB2.0 TO RS232 в диспетчере задач
Такой конвертер эмулирует на время подключения полноценный СОМ – порт, назначая ему название СОМ3. В прочем наименование в настройках можно изменить. При отключении конвертер также исключается из списка в Диспетчере устройств.
В среде разработки Visual Studio (Express Edition 2008) есть компонент на панели управления под названием serialPort позволяющий работать с СОМ – портом. Напишем пример, не большой терминал для обмена текстовыми сообщениями для двух компьютеров.
На форме используются компоненты:
подписи label – 4 штуки.
кнопки – 3 штуки для обработки событий:
button1 – Connect;
button2 – Disconnect;
button3 – Send.
comboBox – 4 штуки для выбора настроек сом – порта:
comboBox1 – Port;
comboBox2 – BaudRate;
comboBox3 – Parity;
comboBox4 – StopBits.
поля ввода текста textBox – 2 штуки:
textBox1 для вывода принятой строки;
textBox2 для ввода передаваемой строки.
serialPort1 – 1 штука.
Вид моей формы показан на рисунке ниже.

Запущенная программа Terminal
Для работы нужно в свойствах компонента serialPort1 установить поля параметров работы сом – порта. Поля свойств можно задать жестко. Но лучше прочесть поддерживаемые параметры системой, а потом записать свойства, удобно и красиво.
В начале загрузки программы обрабатывается метод Form1_Load который последовательно вызывает функции чтения поддерживаемых параметров сом – портов системой. Функции чтения возвращают параметры сом – порта – начальной настройки по умолчанию и заполняют списки comboBox доступными полями свойств. Заполнять списки comboBox из самой функции не рекомендуется это сделано только для примера.
private void Form1_Load(object sender, EventArgs e) { serialPort1.PortName = SetPortName(serialPort1.PortName); serialPort1.Parity = SetPortParity(serialPort1.Parity); serialPort1.BaudRate = SetPortBaudRate(serialPort1.BaudRate); serialPort1.StopBits = SetPortStopBits(serialPort1.StopBits); serialPort1.Handshake = SetPortHandshake(serialPort1.Handshake); BaudRateget(); }
Функция SetPortName возвращает имя последовательного порта по у молчанию и добавляет в comboBox1 доступные сом – порты.
Основной метод GetPortNames в функции SetPortName который возвращает строковой масив имен последовательных портов доступных в системе, если не один из портов не найден, возвращает пустую строку. Для доступа к SerialPort нужно подключить класс using System.IO.Ports;
public string SetPortName(string defaultPortName) { string portName=""; foreach (string portname in SerialPort.GetPortNames()) { comboBox1.Items.Add(portname); //добавить порт в список } comboBox1.SelectedIndex = 0; if (portName == "") { portName = defaultPortName; } return portName; //возвращает порт по умолчанию }
Функции:
SetPortName – возвращает наименование сом – портов comboBox1;
SetPortParity – возвращает бит четности последовательного порта comboBox3;
SetPortBaudRate – возвращает скорость передачи;
SetPortStopBits – возвращет количество стоповых битов comboBox4;
SetPortHandshake – возвращает управление потоком;
BaudRateget – заполняет список скорости передачи comboBox2 бит/с.
В полях ReadTimeout, WriteTimeout компонента SerialPort1 установить занчение 500. Событие serialPort1_DataReceived компонента SerialPort1 принимает и выводит в поле textBox1 принятую строку.
private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e) { string readstring; try { readstring = serialPort1.ReadLine(); textBox1.AppendText(readstring + "\r\n"); } catch (TimeoutException) { } }
Поле Multiline и поле ScrollBars установено в true компонента textBox1. Для добавления многострочного текста.
Нажатие кнопки button1 – Connect вызывает проверку и новое соединение последовательного порта, заполняет свойства полей компонента SerialPort1 выбраными настройками comboBox.
private void button1_Click(object sender, EventArgs e) { string temp; serialPort1.PortName = ((string)comboBox1.SelectedItem); serialPort1.Parity= (Parity)Enum.Parse(typeof(Parity),(string)comboBox3.SelectedItem); temp = ((string)comboBox2.SelectedItem); temp = temp.ToString(); serialPort1.BaudRate = (int.Parse(temp)); serialPort1.StopBits = ((StopBits)Enum.Parse(typeof(StopBits),(string)comboBox4.SelectedItem)); try { serialPort1.Open(); button1.Enabled = false; button2.Enabled = true; button3.Enabled = true; } catch (InvalidOperationException) { } }
Нажатие на кнопку button2 – Disconnect. Закрывает сом – порт освобождая другим приложениям, если не используется. Нажатие на кнопку button3 – Send. Записывает строку передачи, введенную в поле textBox2.
private void button3_Click(object sender, EventArgs e) { string writestring; writestring = textBox2.Text; try { serialPort1.WriteLine(String.Format("{0}", writestring)); textBox2.Clear(); } catch (TimeoutException) { } }
Что бы полностью сделать обмен сообщениями нужно соединить последовательные порты между собой нуль – модемным кабелем. На этом исследование завершено! Исходный пример прилагается в приложении.
Written by Теличко Александр
E-mail:
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
- 10337 просмотров



Комментарии
15 комментария(ев)Дата: Пнд, 15/03/2010 - 22:11
Дата: ПТ, 28/05/2010 - 17:36
А где его скачать, что бы посмотреть, что то не найду.
Дата: ВС, 30/05/2010 - 14:01
Хм... видимо, при добавлении материала не приаатачили исходник. Разберемся.
Дата: СР, 14/07/2010 - 17:13
Дак, где исходник?
Дата: Пнд, 17/01/2011 - 00:14
Всем кто наткнется на статью, статья из номера
http://www.vr-online.ru/page/vr-online-yanvar-2010-31
VR-Online (Январь 2010)
Скачав журнал, увидим в архиве материалы к номеру, там же и будут исходники.
Дата: ВС, 27/11/2011 - 11:33
Замечательная статья, программа рабочая, исходники позволяют создавать новые проекты.
Помогите с отправкой по RS232двоичных кодов, к сожалению я только начал с C#, раньше программировал
на ассемблере и Паскаль для MSDOS.
Дата: СБ, 03/12/2011 - 00:38
Написал терминалку с использованием компонента serialPort. Проверил программу с заглушкой СОМ порта – все нормально работает, передает, принимает, но …только на латинице. При попытке передать кириллицу, в приемном поле texBox печатаются “????????.....”. Так как опыт программирования на C# у меня всего неделя я решил найти аналогичную терминалку в Интернете в надежде найти ошибки в своей программе. Нашел Вашу программу. Проверил и результат точно такой же. Вместо русских букв пишет знаки вопросов. В чем же причина?
Дата: СР, 14/12/2011 - 00:10
Супер статья! Все нормально работает. Код работает передает и принимает Русский текст. Автор этой статьи продает исходный код с поддержкой Русского текста. Так что, то что надо. Был подключен апарат печати чеков на микроконтроллере.
Дата: Втр, 20/12/2011 - 15:11
Позвольте полюбопытствовать, и за сколько же автор продает всего одну строчку программы перекодировки UTF8 в win1251?
Дата: Втр, 20/12/2011 - 16:02