Ответы пользователя по тегу C#
  • Параллельное изучение Java и C# - возможно?

    @vitvov
    Я бы сказал, что параллельное владение несколькими языками это будущие любого программиста. Но если вы начинаете изучение с нуля, то стоит начать из одного. Уча один язык, вы не отвлекаетесь на синтаксис, а осваиваете ООП и алгоритмы. Знание одного языка поможет в освоении другого.
    Ответ написан
    Комментировать
  • Как заставить обновляться ListBox с помощью INotifyPropertyChanged?

    @vitvov
    1 вариант: Ваш класс должен наследовать INotifyPropertyChanged, только тогда он будет работать.
    2 вариант: ObservableCollection реализует INotifyPropertyChanged сам, поэтому, чтоб пользоватся им, ваш код должен выглядеть примерно так:
    class MyClassA
    {
          public ObservableCollection<AnotherClass> ListCode { get; private set; };
            
          public MyClassA()
          {
                // ...
                ListCode = new ObservableCollection<AnotherClass>();
          }
    
          public void GetList()
          {
                ListCode.Clear();
                // ...
                ListCode.Add(new AnotherClass());
          }
    }
    Ответ написан
    Комментировать
  • Как лучше реализовать поддержку плагинов в C#?

    @vitvov
    Все зависит от конкретной задачи.
    Лично я использовал скрипт машину для выполнения плагинов. Скрипты писались на IronPython. Пользователь выбирал задачу, приложение находило нужный скрипт, загружало его в ScriptHost и выполняло. Такая система удобна, если ваше приложение имеет собственное API, доступное из скриптов и любой желающий может написать свою задачу для приложения. SDK, пример.

    Второй вариант - это написание библиотек на C# реализующих один интерфейс. тыц
    Ответ написан
    4 комментария
  • С#, не выполняется this.textBox1.AppendText, другой поток?

    @vitvov
    У вас плохая архитектура приложения.
    Поясню, а дальше дам пример.
    1) MySerialPort должен генерировать события.
    2) Главное окно, где создан этот обьект, должно подписатся на событие. (В принципе, подписатся может кто угодно, но в вашем случае именно главное окно)
    3) При получении нужных данных, класс MySerialPort должен послать событие.
    4) Главное окно получило данные и отобразило их на экран.

    Теперь, как это делается:
    В отдельном файле
    DataCompleadEventArgs.cs
    описываете класс события:
    namespace MyNamespace
    { 
          public delegate void DataCompleadEventHandler(object sender, DataCompleadEventArgs e);
          public class DataCompleadEventArgs : EventArgs
          {
                private string _data;
     	    public DeviceEventArgs (string data)
     	    {
           	          _data; = data
     	    }
     	    public string Data
     	    {
                      get { return _data; }
     	    }
          }
    }


    далее в классе
    MySerialPort
    пишите следующее:
    public class MySerialPort : SerialPort
    {
          //  ваш код ...
          //  обьявляете событие
          public event DataCompleadEventHandler DataComplead;
          //  описываете функцию, чтоб слать событие наружу
          private void OnDataComplead(string message)
          {
                if (DataComplead != null) 
                {
                     DataComplead(this, new DataCompleadEventArgs(message));
                }
          }
    
          public MySerialPort() :base()
          {
                // ваш код ...
                base.DataReceived += new SerialDataReceivedEventHandler(MySerialPort_DataReceived);
          }
    
          void MySerialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
          {
                // то, что тут было написано не нужно !!!
                var port = (SerialPort)sender;
                try
                {
                      // ваш код ...
                      var message = Convert.ToString(rbt);
                      if (_stepIndex == buferSize)
                      {
                            // шлём событие наружу 
                            OnDataComplead(message );
                      }
                }
                catch { }
          }
    }


    И самое главное, в основном окне:
    public partial class Form1 : Form
    {
          public Form1()
          {
                InitializeComponent();
                // ...
          }
    
          private void button2_Click(object sender, EventArgs e)
          {
                var port = new MySerialPort();
                // подписиваемся на событие
                port.DataComplead += OnDataCompleated;
                port.Open(comboBox1.SelectedItem.ToString());
          }
    
          private void OnDataCompleated(object sender, DataCompleadEventArgs e)
          {
                // получаем нужные данные
                var message = e.Data;
                writeTB1(message);
          }
    }


    Вот и всё.
    Ответ написан
    Комментировать
  • C# com-порт получение информации, обработка старт-бита, стоп-бита?

    @vitvov
    Если я правильно понял ваш вопрос, то ваше устройство шлёт постоянно данные и вам нужно только читать.
    Все что вам нужно, это создать подключение к порту и подписаться на событие обновления. При возникновении события вы получите массив данных с порта, этот массив вы сохраняете в буфер или разбираете на лету (как вам удобнее). Напишу для вас маленький пример:
    //  Наследуем наш клас от SerialPort для более красивого кода
    public class MySerialPort : SerialPort
    {
            private const int DataSize = 54;    //  я так и не понял, какой размер данных нужен. Укажите правильное число в байтах
            private readonly byte[] _bufer = new byte[DataSize];
            private int _stepIndex;
            private bool _startRead;
    
            public MySerialPort(string port)
                : base()
            {
                //  все папаметры вы должны указать в соответствии с вашим устройством
                //base.PortName = COM1;
                base.BaudRate = 115200;
                base.DataBits = 8;
                base.StopBits = StopBits.Two;
                base.Parity = Parity.None;
                base.ReadTimeout = 1000;
    
                //  тут подписываемся на событие прихода данных в порт
                //  для вашей задачи это должно подойт идеально
                base.DataReceived += SerialPort_DataReceived;
            }
    
            //  открываем порт передав туда имя
            public void Open(string portName)
            {
                if (base.IsOpen)
                {
                    base.Close();
                }
                base.PortName = portName;
                base.Open();
            }
    
            //  эта функция вызвется каждый раз, когда в порт чтото будет передано от вашего устройства
            void SerialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
            {
                var port = (SerialPort)sender;
                try
                {
                    //  узнаем сколько байт пришло
                    int buferSize = port.BytesToRead;
                    for (int i = 0; i < buferSize; ++i)
                    {
                        //  читаем по одному байту
                        byte bt = (byte)port.ReadByte();
                        //  если встретили начало кадра (0xFF) - начинаем запись в _bufer
                        if (0xFF == bt)
                        {
                            _stepIndex = 0;
                            _startRead = true;
                            //  раскоментировать если надо сохранять этот байт
                            //_bufer[_stepIndex] = bt;
                            //++_stepIndex;
                        }
                        //  дописываем в буфер все остальное
                        if (_startRead)
                        {
                            _bufer[_stepIndex] = bt;
                            ++_stepIndex;
                        }
                        //  когда буфер наполнлся данными
                        if (_stepIndex == DataSize && _startRead)
                        {
                            //  по идее тут должны быть все ваши данные.
    
                            //  .. что то делаем ...
                            //  var item = _bufer[7];
    
                            _startRead = false;
                        }
                    }
                }
                catch {}
            }
    }

    использовать это нужно так:
    var port = new MySerialPort();
    port.Open("COM5");

    Это код прототипа, всего лишь техника работы которая может помочь вам.
    Ответ написан
    2 комментария