Работа с 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:

Комментарии

15 комментария(ев)
аватар: lpandrewlp
lpandrewlp
Дата: Пнд, 15/03/2010 - 22:11
Звание: Наблюдатель
Сообщений: 1

Smile

аватар: maksyminfo
maksyminfo
Дата: ПТ, 28/05/2010 - 17:36
Звание: Наблюдатель
Сообщений: 1

Цитировать
Исходный пример прилагается в приложении.

А где его скачать, что бы посмотреть, что то не найду.

аватар: Lord_of_fear
Lord_of_fear
Дата: ВС, 30/05/2010 - 14:01
Звание: Мастер
Сообщений: 1992

Цитировать
А где его скачать, что бы посмотреть, что то не найду.

Хм... видимо, при добавлении материала не приаатачили исходник. Разберемся. Smile

аватар: root-master
root-master
Дата: СР, 14/07/2010 - 17:13
Звание: Наблюдатель
Сообщений: 1

Дак, где исходник?

аватар: Solder
Solder
Дата: Пнд, 17/01/2011 - 00:14
Звание: Наблюдатель
Сообщений: 1

Всем кто наткнется на статью, статья из номера
http://www.vr-online.ru/page/vr-online-yanvar-2010-31
VR-Online (Январь 2010)
Скачав журнал, увидим в архиве материалы к номеру, там же и будут исходники.

аватар: isakov_s_s
isakov_s_s
Дата: ВС, 27/11/2011 - 11:33
Звание: Наблюдатель
Сообщений: 1

Замечательная статья, программа рабочая, исходники позволяют создавать новые проекты.
Помогите с отправкой по RS232двоичных кодов, к сожалению я только начал с C#, раньше программировал
на ассемблере и Паскаль для MSDOS.

аватар: ddssu
ddssu
Дата: СБ, 03/12/2011 - 00:38
Звание: Наблюдатель
Сообщений: 4

Написал терминалку с использованием компонента serialPort. Проверил программу с заглушкой СОМ порта – все нормально работает, передает, принимает, но …только на латинице. При попытке передать кириллицу, в приемном поле texBox печатаются “????????.....”. Так как опыт программирования на C# у меня всего неделя я решил найти аналогичную терминалку в Интернете в надежде найти ошибки в своей программе. Нашел Вашу программу. Проверил и результат точно такой же. Вместо русских букв пишет знаки вопросов. В чем же причина?

аватар: Anastasiya
Anastasiya
Дата: СР, 14/12/2011 - 00:10
Звание: Наблюдатель
Сообщений: 4

Супер статья! Все нормально работает. Код работает передает и принимает Русский текст. Автор этой статьи продает исходный код с поддержкой Русского текста. Так что, то что надо. Был подключен апарат печати чеков на микроконтроллере.Smile

аватар: ddssu
ddssu
Дата: Втр, 20/12/2011 - 15:11
Звание: Наблюдатель
Сообщений: 4

Позвольте полюбопытствовать, и за сколько же автор продает всего одну строчку программы перекодировки UTF8 в win1251?

аватар: DrBlack
DrBlack
Дата: Втр, 20/12/2011 - 16:02
Звание: Советник
Сообщений: 923

Big smile +1