Category: C sharp

Фев 17 2015

FPU. Часть 1

Не задумывались ли вы о том, как работает FPU процессора? Казалось бы, там всё довольно просто. Есть стандарт представления чисел с плавающей точкой, IEEE754, а сама реализация арифметических операций очевидна.
Но на самом деле, за кажущейся простотой скрыто множество нюансов.

Read more »

Сен 22 2013

Обновление ModbusEasy

ModbusEasy — моя утилита для работы с протоколом Modbus.

Утилита opensource, исходники и бинарники доступны для скачивания здесь: https://github.com/arktur04/modbuseasy/archive/master.zip.

Добавлены несколько команд:

getdb -a  -получить список всех переменных в текущей конфигурации

getdb <varname>  -получить текущее значение переменной

setdb <varname>  -установить текущее значение переменной

 

Также добавлено простое консольное приложение, работающее с modbuseasy в режиме slave. Оно изменяет по таймеру значения двух переменных и может использоваться как для тестирования приложений, работающих с протоколом Modbus в режиме master.

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

Все исходники на C#.

Июл 06 2013

Использование Reflection для динамического создания компонентов в C#

Пусть есть следующая задача: нужно, чтобы форма приложения создавалась динамически в run-time, на основе конфигурационного файла, например, в формате xml. Подобные задачи могут решаться разными способами, например, с помощью XAML (основан на XML, технология Microsoft), или QML (основан на Java Script, технология Qt). Ниже приводится пример реализации такого подхода на основе XML и механизма Reflection, доступного в С#.

Итак, Reflection — это часть платформы .Net, позволяющая использовать метаданные сборки в run-time. Это означает, что мы можем создать экземпляр класса, зная его имя, и присвоить значения его свойствам, зная их имена и значения. Помимо перечисленного, Reflection включает в себя еще много возможностей, но пока нам хватит этих.

Далее под катом

Read more »

Май 14 2013

Утилита для работы с протоколом Modbus

Написал простую утилиту для работы с протоколом Modbus. Утилита поддерживает работу как в режиме Master, так и в режиме Slave, что позволяет не только обращаться к устройству по шине Modbus, но и эмулировать устройство. Утилита пока поддерживает только протокол Modbus RTU, функции 1-6, 15, 16.

Графического интерфейса нет (и пока не предвидится), конфигурируется из файла xml, его структура проста и понятна, его легко можно править руками.

Пока функциональность утилиты минимальна, буду ее улучшать, когда будет на это время. В ближайших планах — поддержка Modbus TCP.

Утилита написана на C#.

Скачать исходники можно здесь: https://github.com/arktur04/modbuseasy

Ссылка на скачивание бинарника: https://www.box.com/s/ob8938m0cl93oglktnm6

 

Июн 28 2012

Книга «C# 3.0. Справочник»

Сразу следует сказать, что русский перевод названия, мягко говоря, неточен. В оригинале книга называется «C# 3.0 In a Nutshell», авторы Joseph Albahari, Ben Albahari. Книга представляет собой прекрасный учебник по языку C#, и охватывает темы, начиная с основ синтаксиса, типов и переменных и заканчивая более сложными темами, такими как небезопасный код или препроцессорные директивы.

В книге нет описания Windows Forms и прочих примитивных вещей. Материал книги отличается глубиной и сложностью. Я рекомендую эту книгу всем, кто хочет использовать именно сложные особенности языка C# и платформы .Net, а не конструировать пользовательские интерфейсы из визуальных компонентов.

Есть и более новое издание этой книги, по версии языка C# 4.0.

Мар 31 2012

XML-сериализация IP-адреса в C#

При попытке сериализации объекта с полем вида

public IPAddress ip

возникает Run-time error типа System.InvalidOperationException

Причина заключается в том, что класс IPAddress не имеет конструктора по умолчанию (parameterless ctor), необходимый для XML-сериализации, при этом то, что класс IPAddress имеет атрибут [SerializableAttribute], не имеет значения, т.к. этот атрибут действует только на binary и Soap-сериализацию.

Решается проблема, например, так:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;

using System.Xml.Serialization;
using System.IO;

namespace SerializationTest
{
    public enum MyEnum { enum1, enum2, enum3 }

    [Serializable]
    public class Test
    {
        public Test()
        {
            a = 1;
            b = true;
            s = "string";
            ip = IPAddress.Loopback;
        }

        public int a;
        public bool b;
        public string s;
        public MyEnum e;

        [XmlElement(ElementName = "IPAddress")]
        public string IPAddressAsString
        {
            get { return ip != null ? ip.ToString() : null; }
            set
            {
                IPAddress a;
                if (value != null && IPAddress.TryParse(value, out a))
                    ip = a;
                else
                    ip = null;
            }
        }

        [XmlIgnore]
        public IPAddress ip { get; set; }
    }

    class Program
    {
        static void Main(string[] args)
        {
            Test test = new Test();
            
            XmlSerializer xs = new XmlSerializer(typeof(Test));
            FileStream writer = new FileStream("file.xml", FileMode.OpenOrCreate);
            xs.Serialize(writer, test);
            writer.Close();
        }
    }
}
Фев 29 2012

Конвертор изображения в код

Программа для перевода изображений в массив С. Переводит изображение в массивы чисел 32 бита, 16 бит (5+5+5), а также 8 бит с палитрой (также создается массив палитры).

Загружаем картинку:

Выбираем палитру (если хотим сконвертировать изображение в 8-битный формат):

Получаем:

{
0x52, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xAD, 0x49, 0xFF, 0xFF, 0x52, 0x09, 0xAD, 0xA4, 0x5B,
0xFF, 0xFF, 0xFF, 0xA4, 0x00, 0xF6, 0xFF, 0xAD, 0x09, 0x09, 0x09, 0x52, 0xAD,
0xFF, 0xFF, 0xF6, 0x00, 0x09, 0x09, 0x09, 0x00, 0xA4, 0xFF, 0xF6, 0x5B, 0x09,
0x49, 0x00, 0x5B, 0xF6, 0xFF, 0xFF, 0x52, 0x09, 0x09, 0x09, 0x09, 0x5B, 0xFF,
0xFF, 0xF6, 0x52, 0x09, 0x49, 0x00, 0xA4, 0xFF, 0xFF, 0xFF, 0xAD, 0x00, 0x09,

Получаемый код отформатирован по ширине (в колонку не более 80 символов шириной).

Язык C#, среда разработки Visual Studio 2010.

Ссылка для скачивания программы и исходников: https://bitbucket.org/arktur04/pictureencoder

Окт 13 2011

Скриншоты с экрана устройства

Для получения скриншотов с экранов устройств была разработана маленькая утилитка, получающая текущее изображение по Rs-232.

Сама утилитка написана на C#, в программу устройства был добавлен небольшой фрагмент, отправляющий в UART изображение из буфера:

switch(buf[1])
{
case 0x03: //read multiple holding registers (0x04)
  ...
  break;
//Другие команды Modbus
...

case 0xFF: //  Команда получения скриншота

...
  return PrintScreen(uartNum);
};

Таким образом, стандартные команды Modbus «расширяются» специальной командой с кодом 0xFF, при получении которой устройство посылает в порт копию экрана (для монохромного экрана 128*64 это составляет ровно 1 кбайт данных).

Утилитка очень простая, небольшое (но, как оказалось, легко решаемое) затруднение вызвал тот факт, что С# работает с COM-портом не так, как другие системы (например, Delphi).

C# создает отдельный поток исполнения для обработчика события приема сообщения COM-порта. А раз это отдельный поток, в нем нельзя отрисовывать изображение (операции с графикой не являются в .Net потокобезопасными).

Проблему можно решить двумя путями: верным и неверным.

Read more »