Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » .NET - Работа с потоками. Чтение из COM-порта

Ответить
Настройки темы
.NET - Работа с потоками. Чтение из COM-порта

Аватара для Tonny_Bennet

Ветеран


Сообщения: 1384
Благодарности: 178


Конфигурация

Профиль | Отправить PM | Цитировать


Здравствуйте.

Пишу на C# программу, которая будет общаться с ком портом. Создал форму. Добавил в неё объект SerialPort. Программа открывает порт. Записывает в него данные. У порта есть событие DataReceived, которое как я понимаю наступает во время получения данных. Я хочу эти данные выводить на форму в RichTexBox (в коде rtb_log). Но в момент когда из порта должен прийти ответ возникает ошибка:

Недопустимая операция в нескольких потоках: попытка доступа к элементу управления "rtb_log" не из того потока, в котором он был создан.

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


Вы не могли бы мне как можно проще и нагляднее пояснить как можно решить данную проблему? На пальцах попытаться объяснить как в данном случае работать с потоками...

Код: Выделить весь код
        private void btn_open_port_Click(object sender, EventArgs e)
        {
            try
            {
                serialPort.PortName = "COM" + tb_com.Text;
                serialPort.Open();             
            }
            catch (Exception error)
            {
                MessageBox.Show(error.Message);
            }    
        }

        private void btn_write_Click(object sender, EventArgs e)
        {
            try 
            {
                string s = tb_write.Text + "\r\n";
                serialPort.WriteLine(s);
                rtb_log.AppendText(s);
            }
           catch (Exception err)
            {
                MessageBox.Show(err.Message);
            }   
        }

        private void serialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            try
            {
                byte[] b = new byte[128];
                serialPort.Read(b, 0, b.Length);              
                string s = Encoding.ASCII.GetString(b);
            }
            catch (Exception e3)
            {
                MessageBox.Show(e3.Message);
           }

        }

-------
Сообщение оказалось полезным? Кнопка Полезное сообщение располагается чуть ниже.


Отправлено: 16:01, 16-02-2012

 

Аватара для ferget

Разный


Сообщения: 1294
Благодарности: 359

Профиль | Отправить PM | Цитировать


вот тут
http://msdn.microsoft.com/ru-ru/libr...areceived.aspx
об этом написано
Это сообщение посчитали полезным следующие участники:

Отправлено: 16:15, 16-02-2012 | #2



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

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


Аватара для Delirium

Ветеран


Сообщения: 5624
Благодарности: 936

Профиль | Отправить PM | Цитировать


Tonny_Bennet, эта проблема была недавно описана в этом форуме. http://forum.oszone.net/thread-227336.html

-------

Пройденные курсы:
[Microsoft №10174 Sharepoint], [SharePoint]
Мои проекты:[CheckAdmins], [NetSend7], [System Uptime], [Remote RAdmin LogViewer],[Netdom GDI], [Holidays - напоминалка о днях рождения]

А я офис-гуру :)

Это сообщение посчитали полезным следующие участники:

Отправлено: 00:54, 17-02-2012 | #3


Аватара для Tonny_Bennet

Ветеран


Сообщения: 1384
Благодарности: 178

Профиль | Отправить PM | Цитировать


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

Поправьте меня если я не прав:

Сначала я записываю в порт массив из байт.
Затем обработчик событий serialPort_DataReceived срабатывает при приходе сообщения с порта.
В теле обработчика я запускаю чтение того количества элементов массива, которые есть в буфере приёма serialPort.BytesToRead.
Но когда в этом же обработчике я пытаюсь записать считанные байты в элемент формы мне вылетает ошибка: попытка доступа к элементу управления "rtb_log" не из того потока, в котором он был создан.
Может мне нужно после прочтения сообщения создать событие: "Сообщение прочитано: текст сообщения"
А для rtb_log сделать обработчик событий который будет ловить эти сообщение и выписывать в форму?


Расскажите пожалуйста как это сделать правильно....

P.S. Язык MSDN не всегда понятен

В примере

Код: Выделить весь код
 
    private static void DataReceviedHandler(
                        object sender,
                        SerialDataReceivedEventArgs e)
    {
        SerialPort sp = (SerialPort)sender;
        string indata = sp.ReadExisting();
        Console.WriteLine("Data Received:");
        Console.Write(indata);
    }
Всё создаётся в консоли и наверное из-за этого не возникает ошибки связанной с потоками

-------
Сообщение оказалось полезным? Кнопка Полезное сообщение располагается чуть ниже.


Отправлено: 16:19, 20-02-2012 | #4


Аватара для Delirium

Ветеран


Сообщения: 5624
Благодарности: 936

Профиль | Отправить PM | Цитировать


Tonny_Bennet, я же тебе написал решение проблемы. Там даже код есть. Внедряешь его себе и пишешь спокойно дальше многопоточный код. Ну или идешь кривым путем и перед вызовом вывода сообщений пишешь
Код: Выделить весь код
Control.CheckForIllegalCrossThreadCalls = false;
(об этом тоже есть в приведенной мной ссылке).

-------

Пройденные курсы:
[Microsoft №10174 Sharepoint], [SharePoint]
Мои проекты:[CheckAdmins], [NetSend7], [System Uptime], [Remote RAdmin LogViewer],[Netdom GDI], [Holidays - напоминалка о днях рождения]

А я офис-гуру :)


Отправлено: 01:08, 21-02-2012 | #5



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » .NET - Работа с потоками. Чтение из COM-порта

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
C/C++ - Приложение с потоками. Noglick Программирование и базы данных 1 19-04-2011 18:43
Delphi - Работа С Потоками LilLoco Программирование и базы данных 7 02-06-2010 22:12
[решено] Чтение из COM порта w3d1 AutoIt 5 18-09-2009 12:36
чтение данных из COM-порта в лог romez777 Программирование в *nix 0 28-11-2007 15:57
Чтение IP адресов Sanchos Сетевые технологии 6 25-05-2006 09:15




 
Переход