» » » Программа обмена по RS-232 на языке C# в среде Microsoft Visual Studio

 
 
 

Программа обмена по RS-232 на языке C# в среде Microsoft Visual Studio

Разместил Serhiy_UA 14 мая 2013. Просмотров: 22 549

5
Программа обмена по RS-232 на языке C# в среде Microsoft Visual Studio

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

Мне приходилось программировать в Turbo Pascal, затем в Delphi и, наконец, в Borland C++ Builder 6.0. Все они были по-своему интересны и полезны. Однако сейчас становятся популярны новые среды программирования, и надо не отставать от других пользователей в их освоении. Как мне кажется, наиболее перспективной является среда Microsoft Visual Studio 2010 (сокращенно MSVS2010) и программирование на языке C# (си шарп). Некоторые скажут зачем, но как поговариваю: летчик должен уметь летать на всем что летает, и немного на том, что не летает, если он конечно профессионал.
Книг по среде Microsoft Visual Studio 2010 и языку C# достаточно, учебные и пробные версии ПО можно найти в интернете, так что можно смело начинать.

В приложении - готовый, написанный мною открытый проект, который можно использовать в своих работах как образец-заготовку. Проект небольшой, так что его легко будет освоить, затем дополнить и расширить его функциями, в общем, использовать по своему усмотрению.
При запуске программы PR14_RS-232.exe непосредственно или через оболочку MSVS2010 появится следующее основное окно, что на следующем рисунке.
Программа обмена по RS-232 на языке C# в среде Microsoft Visual Studio

В окне два поля для отображения кода выдачи и принятого кода и три кнопки управления. Сразу отмечу, что коды обмена отображаются байтами в 16-ричной системе счисления, а сами байты отделены пробелами. Например, для выдачи кода нужно в режиме обычного редактирования подготовить код, а затем кликнуть по кнопке «Выдать». В данном случае в качестве шаблона предлагается выдать код их шести байт: 0f 12 34 56 78 90. Если по ошибке будет введен символ, не принадлежащий 16-ричной системе, то при нажатии на кнопку, выдачи не произойдет, но появится следующее сообщение об ошибке.

Все принятые коды выводятся в аналогичном формате в окне «Принятый код», при этом размер принятого кода может быть достаточно большим, и в этом случае дополнительно появляется полоса прокрутки.

То есть используя данную программу можно обмениваться через СОМ1 со скоростью 9600 бит/с, что вполне достаточно для многих приложений при работе с микроконтроллерами.

А что же внутри программы, каков исходный код?

Основная часть написанной мною программы для проекта PR14_RS-232.sln содержится в файле Form1.cs.

Рассмотрим некоторые особенности и функции кода в этом файле Form1.cs.
В самом начале файла, основные подключения через директивы using, без которых ничего работать не будет. Последние из них, что с комментариями, необходимы для работы с СОМ портом и таймером. По поводу таймера, СОМ порт может обходиться и без него, таймер добавлен для последующего улучшения пользовательского интерфейса.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

using System.IO; // для работы с СОМ портом
using System.IO.Ports;

using System.Timers; // Для работы с таймером

Создание СОМ порта обеспечивают следующие строки в class Form1. Здесь же видно, что обмениваться данными будем через СОМ1, но легко можно задать и другие.
    public partial class Form1 : Form
    {
        private SerialPort port = new SerialPort("COM1");// Создание СОМ-порта

Кстати, если скорость и другие параметры не устраивают, то их меняем подобно следующему:
private SerialPort port = new SerialPort("COM1", 19200, Parity.None, 8, StopBits.One);

В основной функции public Form1() четыре строки. Первая формирует основную форму с кнопками и окошками, это стандартная строка, которая всегда создается автоматически. Следующие две строки создают обработчик прерываний для обменов по СОМ порту и отрывают сам СОМ порт. Четвертая строка выводит шаблон из шести байт в окно выдачи, к которому можно сделать привязку и, конечно, изменить.
public Form1()
        {
            InitializeComponent();
            port.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);
            port.Open(); // Open the port
            richTextBox2.Text = "0f 12 34 56 78 90";
        }

В обработчике приема void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e) имеется две строки, одна в самом начале, а другая в конце. Эти строки необходимы для синхронизаций, их обязательно надо применять. Управление передается обработчику, как только во входном буфере СОМ порта появляются принятые данные. Для считывания данных применяется следующие три строки. Здесь принятые коды считываются в байтовый буфер buffer.
      int bytes = port.BytesToRead;
            byte[] buffer = new byte[bytes];
            port.Read(buffer, 0, bytes);

Очередные следующие за ними три строки выводят данные в окно «Принятый код». Таким образом, в этом обработчике осуществляется прием по RS-232 и побайтный вывод принятого кода, а между байтами вставляются пробелы, что улучшает их обзор.

В обработчике выдачи private void button1_Click(object sender, EventArgs e), который запускается по кнопке «Выдать», осуществляются следующие действия. Проверяется, все ли символы в окне «Код выдачи» принадлежат 16-ричной системе счисления. Для этого используются первые двадцать строк кода, а при ошибке выводится сообщение через MessageBox.Show. Затем осуществляется собственно сама выдача, для этого применены следующие строки:
   byte[] bytes = new byte[Str.Length / 2];

            for (int i = 0; i < Str.Length / 2; i++)
            {
                char ch1 = Str[i * 2];
                char ch0 = Str[i * 2 + 1];
                bytes[i] = (byte)(STB(ch1) << 4 | STB(ch0));
                
            } 
            port.Write(bytes, 0, bytes.Length);

Где в последней строке, bytes – это сам подготовленный массив байт для выдачи, а bytes.Length – число выдаваемых в СОМ порт байт. Данный обработчик использует еще функцию private byte STB(char ch), служащую для преобразования знаковых символов в числа.

При нажатии кнопок «Очистить» работают обработчики private void button3_Click(object sender, EventArgs e) и private void button2_Click(object sender, EventArgs e), основная задача которых очистка окон приема и выдачи.
Вот такая небольшая программка.

Файлы

В архиве проект на языке C# в среде Microsoft Visual Studio 2010 и готовый файл PR14_RS-232.exe
PR14_RS-232.zip | Файл 52,1 Kb загружен 79 раз.

Немного о себе

Я занимаюсь схемо-техникой с применением микроконтроллеров. Их было у меня достаточно много: это Intel 8080, 8051, 196, Atmel AT90, AVR, ATtiny и megaAVR, Silabs, а также NiosII. Их я программировал на ассемблере и С, и связывал с персональным компьютером по интерфейсу RS-232 на подобных программах, ну и с более сложным функционалом.

Желаю удачи!
Сергей
Имя героя неизвестно (Serhiy_UA)
Местоположение в тайне.
Профиль Serhiy_UA
О себе автор ничего не сообщил.
 

Понравилось? Палец вверх!

  • всего лайков: 37

Поделись с друзьями!

Связанные материалы:


Визуализация для микроконтроллера. Часть 1. OLED дисплей 0.96" (128х64) на SSD1306

Добрый день, друзья! Эта статья открывает цикл, посвящённый средствам визуального отображения...

Трансивер 2,4 ГГц Nordic Semiconductor nRF24L01. Перевод таблиц даташита, пояснения

Привет, датагорцы! Выкладываю перевод таблиц из спецификации nRF24L01+, файл с пояснениями и...

Программирование точных часов с применением алгоритма Брезенхама (Bresenham's

В свое время меня заинтересовала возможность реализации точного хода часов программно. Алгоритмы...

Программа ForMC в помощь программисту микроконтроллеров

Программа называется ForMC, изначально предназначалась для МК AVR. В ней объединены несколько...

Программа для лабораторного блока питания с микропроцессорным управлением на ATMega16

Обещанный релиз первого варианта "правильной" программы к статье Сделай сам лабораторный блок...

Програмирование в AVR Studio 5 с самого начала. Часть 5

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

RusTV Player - программа для просмотра более 300 TV-каналов онлайн

Я встретил в Сети интересную программку RusTV Player Артура Каримова из г. Омск. Это программа для...

Elect_60: программа микроконтроллерного управления внешними устройствами от ПК

Многие наши коллеги желающие создать микроконтроллерное устройство, управляемое от ПК сталкиваются...

Портативный анализатор ИК сигналов «IR-master»

Каждый радиолюбитель сталкивающийся с применением в своих конструкциях дистанционных пультов...

Микроконтроллеры. Связь с внешним миром. Часть 2

Здравствуйте, дорогие Датагорцы! По некоторым слабо зависящим от меня причинам не мог участвовать в...

Грызем микроконтроллеры. Урок 1.

Эту статью (а точнее цикл статей…) я решил полностью посвятить микроконтроллерам фирмы Atmel....

Программирование микроконтроллеров ATmega

Хеллоу ВСЕМ!!! Итак, как я и обещал, расскажу как залить программу в МК. Для этого нам понадобится...
<
  • Гражданин
14 мая 2013 17:06

Алексей / alex

  • С нами с 7.01.2012
  • Ушёл в реал Пользователь offline
  • 58 комментариев
  • 4 публикации
 
  • 0
Неплохой пример. Спасибо. Жаль только программлю на бэйсике из VS2010.
Теперь modbus библиотеку осталось написать.

<
  • Гражданин
14 мая 2013 18:22

Юрий / KYV

  • С нами с 19.10.2008
  • Ушёл в реал Пользователь offline
  • 8 комментариев
  • 0 публикаций
 
  • 0
Спасибо.

<
  • Гражданин
14 мая 2013 19:43

Александр / koan51

  • С нами с 18.03.2010
  • Ушёл в реал Пользователь offline
  • 60 комментариев
  • 5 публикаций
 
  • 0
Спасибо за статью.
Познавательно.

"размер принятого кода может быть достаточно большим" - поэтому не помешала бы кнопка "сохранить как" или вывод в файл.
Хотя через буфер обмена наверно можно.

<
  • Гражданин
17 мая 2013 21:59

Юрий / GogaZh

  • С нами с 15.12.2008
  • Ушёл в реал Пользователь offline
  • 34 комментария
  • 0 публикаций
 
  • 0
У многих в бэкграунде присутствует Pascal в разных инкарнациях.
Возможно, что им будут интересны Free Pascal и Lazxarus (ссылки не даю, т.к. все гуглится «на счет раз»).

Lazxarus читать как Lazarus

<
  • Гражданин
18 мая 2013 20:47

Александр / MerBas

  • С нами с 8.12.2010
  • Ушёл в реал Пользователь offline
  • 19 комментариев
  • 0 публикаций
 
  • 0
Спасибо за статью.
"PR14_RS-232.exe" у меня не запустился, подозреваю, что нужны DLL, ну не посмотрел на Вашу Сергей форму приложения, не беда - код-то я почитал и без Microsoft Visual Studio 2010.

Удивляет как просто в С# решается допуск к порту.Я в CBuilder добирался (правда до LPT) очень долго (хотелось сделать временный паралельный программатор,чтобы оживить Mega8 после первых эксперементов с фьюзами), а здесь всё так чудно - просто создал класс "private SerialPort port = new SerialPort("COM1");" и получил нужные для программатора методы: "port.Read()","port.Write()".

Информация
Вы не можете участвовать в комментировании. Вероятные причины:
— Администратор остановил комментирование этой статьи.
— Вы не авторизовались на сайте. Войдите с паролем.
— Вы не зарегистрированы у нас. Зарегистрируйтесь.
— Вы зарегистрированы, но имеете низкий уровень доступа. Получите полный доступ.