Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Работа с данными COM порта (C#)

79K
08 сентября 2012 года
Voronar
13 / / 09.06.2012
Здравствуйте.
Возникла проблема при обработке данных COM порта.
Имеется очень примитивный метод считывания данных по нажатию кнопки.


Код:
namespace com_data
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        SerialPort arduino = new SerialPort("COM3", 9600, Parity.None, 8, StopBits.One);

        private void button1_Click(object sender, EventArgs e)
        {            
            arduino.Open();            
        }

        private void button2_Click(object sender, EventArgs e)
        {
           
            string s = arduino.ReadExisting();
            textBox1.Text = s;
        }

        private void button3_Click(object sender, EventArgs e)
        {
            arduino.Close();
        }
    }
}
В дальнейшем мне будет необходимо записывать данные в БД MySQL.
Данные последов. порта приходят с заданным мной интервалом (5 сек). Как мне проследить получение данных? То есть мне нужен такой обработчик, который бы получив сигнал о том, что данные пришли, записал эти данные куда мне нужно и ждал бы следующего сообщения с данными.
SerialPort.DataReceived по-моему должен помочь. Но я не знаю как работать с событиями в С#. Я только начинаю работать с этим языком.

Заранее благодарен.
40K
11 сентября 2012 года
D129
228 / / 18.04.2012
Код:
private delegate void StDelegate(Label Info, string Text);
        private void SetText(Label Info, string Text)
        {
            if (Info.InvokeRequired)
            {
                StDelegate DDD = new StDelegate(SetText);
                Info.Invoke(DDD, new object[] { Info, Text });
            }
            else
            {
             
                Info.Text = Text;
            }

        }


Вызов такой :


             
                    SetText(this.labelStatus, "Stopped!");
Только вместо Label - TextBox
и вместо textbox1.Text = indata;

SetText(this.textbox1, indata);
414
08 сентября 2012 года
CassandraDied
763 / / 24.05.2012
И тебе хочется, чтобы тебя научили пользоваться гуглом, верно? Потому что сам ты не можешь открыть новую вкладку, набрать в адресной строке google.ru, а потом в строке поиска - "события в C# dot.net"? Кстати, у меня первая ссылка по этому запросу ведёт на codenet, у тебя, конечно, вряд ли так получится, но если не получится ничего совсем, то ты сможешь поискать нужную информацию на этом сайте в разделе статей.
UPD: ещё один хинт, если тебе не хочется учиться пользоваться гуглом, то почти для каждого метода, свойства, класса, конструктора и евента на офигенном сайте для программеров под dot.net и не только - msdn.microsoft.com - есть пример кода. Для твоей задачи тоже код имеется.
79K
08 сентября 2012 года
Voronar
13 / / 09.06.2012
Спасибо.
Разбирался с кодом мсдн на мою тему и возникла проблема.
Есть вот такой кусок:

 
Код:
private static void DataReceivedHandler(
                        object sender,
                        SerialDataReceivedEventArgs e)
    {
        SerialPort sp = (SerialPort)sender;
        string indata = sp.ReadExisting();
        Console.WriteLine("Data Received:");
        Console.Write(indata);
    }
Я все перенес в формы и хотел внести необходимые изменения. Ну, например, чтобы мои данные отображались в TextBox. Проблема в том, что textBox1 не виден внутри этой функции (или это событие, не знаю как правильно назвать). И переменную indata оттуда никак не вытащить.
40K
09 сентября 2012 года
D129
228 / / 18.04.2012
Цитата: Voronar

Я все перенес в формы и хотел внести необходимые изменения. Ну, например, чтобы мои данные отображались в TextBox. Проблема в том, что textBox1 не виден внутри этой функции (или это событие, не знаю как правильно назвать). И переменную indata оттуда никак не вытащить.



Это функция. Текст бокс не виден, потому, что вам нужно разобраться в отличиях статических и динамических переменных.
Данные из ком-порта по моему, должны быть в SerialDataReceivedEventArgs e - сделайте у себя е. - и посмотрите, что там есть, не надо будет самостоятельно вытаскивать.

Но это только начало сложностей - этот эвент (SerialDataReceived) вызывается обьектом ком-порта в другом потоке.
И вам в винформах надо будет использовать Invoke. - чтобы уведомить винформ контрол (текст бокс) о изменении свойства Text.

Крутовато вы взялись - первое приложение и уже интеграция.

79K
11 сентября 2012 года
Voronar
13 / / 09.06.2012
Спасибо за объяснение.
Взялся, потому что это очень необходимо. Вопрос жизни и смерти. Я готов во всем разобраться.
Есть такой код, после компиляции которого возникает ошибка несогласования потоков в строке с текстбокс1 (вы упоминали об этом):

Код:
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.Ports;

namespace com_data
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        SerialPort mySerialPort = new SerialPort("COM4");
        string s;
       
        private void button1_Click(object sender, EventArgs e)
        {        
         
        mySerialPort.BaudRate = 9600;
        mySerialPort.Parity = Parity.None;
        mySerialPort.StopBits = StopBits.One;
        mySerialPort.DataBits = 8;
        mySerialPort.Handshake = Handshake.None;

        mySerialPort.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);
        mySerialPort.Open();
       

       
        }

        private void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e)
        {
            SerialPort sp = (SerialPort)sender;
            string indata = sp.ReadExisting();
            textbox1.Text = indata;    
        }

        private void button3_Click(object sender, EventArgs e)
        {
            mySerialPort.Close();
        }
Помогите, пожалуйста, разобраться с Invoke. Можно на каком-нибудь маленьком кусочке кода. В мсдн довольно таки объемный код, но я постараюсь его разобрать, если это понадобится.
414
11 сентября 2012 года
CassandraDied
763 / / 24.05.2012
Пример с ProgressBar'ом. Тебе то же самое, но для TextBox'a нужно сделать.
Код:
public void HideProgressBar()
        {
            if (progressWindow.InvokeRequired)
            {
                StopProgressDel del = new StopProgressDel(HideProgressBar);
                progressWindow.Invoke(del, null);
            }
            else
                if (progressWindow != null)
                    progressWindow.Hide();
        }
StopProgressDel - делегат.
79K
11 сентября 2012 года
Voronar
13 / / 09.06.2012
Спасибо. У меня почти также получилось. Только модификаторы доступа у меня были паблик. И у делегата у меня был один аргумент - строка.
А зачем второй аргумент объект класса текстбокс?
79K
11 сентября 2012 года
Voronar
13 / / 09.06.2012
Вопрос немножко не в тему.
А на каком языке проще всего работать с последовательными портами? Мне кажется, что на C#. В нем столько готовых средств, облегчающих программирование. Или я заблуждаюсь...
297
12 сентября 2012 года
koodeer
1.2K / / 02.05.2009
Цитата: Voronar
А на каком языке проще всего работать с последовательными портами? Мне кажется, что на C#. В нем столько готовых средств, облегчающих программирование. Или я заблуждаюсь...


Похоже, заблуждаешься.
Класс SerialPort - это не часть языка, это часть фреймворка .NET. Так же и класс Form - часть фреймворка, а не языка. Эти и многие другие классы доступны в любом языке под платформу .NET.
Однако, язык C# весьма удобный, мощный, и в то же время довольно простой. Продолжай осваивать его.

40K
12 сентября 2012 года
D129
228 / / 18.04.2012
Цитата: Voronar
Спасибо. У меня почти также получилось. Только модификаторы доступа у меня были паблик. И у делегата у меня был один аргумент - строка.
А зачем второй аргумент объект класса текстбокс?



Чтобы использовать эту функцию для любого текстбокса на форме, а не только одного-единственного.

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

Соблюдение этого принципа очень помогает потом делать изменения.

79K
12 сентября 2012 года
Voronar
13 / / 09.06.2012
Спасибо всем за советы и пожелания.
На этом моя работа не останавливается. Теперь мне необходимо научится подключаться к MySQL и записывать туда данные. Слышал что есть удобный коннектор для .NET языков от MySQL.
Для этой задачи лучше завести новую тему или продолжать тут, если возникнут вопросы?
40K
12 сентября 2012 года
D129
228 / / 18.04.2012
Лучше новую.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог