Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Framework v. 2.0  (Прочитано 14254 раз)
0 Пользователей и 1 Гость смотрят эту тему.
MOPO3
Ай да дэдушка! Вах...
Команда клуба

lt
Offline Offline
Пол: Мужской
Холадна аднака!


WWW
« : 12-04-2005 10:56 » new

Пробую писать прогу используя САБЖ, потому как там реадизована работа  с ком портами на уровне фреймворка.
Получаю эксепшн, который понять толком не могу Жаль
Точнее как бы и понимаю, а вот как избавиться от него не знаю ЖальЖальЖаль
Вот эксепшн : Illegal cross-thread operation
Поясните пожалуйста кто может что это, почему это и как обойти.

Вот сам код :
Код:
namespace SerialTest
{
    partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            if (serialPort1.IsOpen)
            {
                serialPort1.Close();
                serialPort1.PortName = "COM1";
            }
            else
            {
                serialPort1.PortName = "COM1";
                serialPort1.Open();
                if (serialPort1.IsOpen)
                {
                    label1.Text = "COM1 Port : port is opened successfully!";
                }
                else
                {
                    label1.Text = "COM1 Port : impossible to open port!";
                }
            }
        }

        private void button2_Click(object sender, EventArgs e)
        {
            serialPort1.Close();
            label1.Text = "COM1 Port : port successfully closed!";
        }

        private void serialPort1_ReceivedEvent(object sender, System.IO.Ports.SerialReceivedEventArgs e)
        {
            string data = serialPort1.ReadLine(); // Вот тут вылетает эксепшн
            label2.Text = data;
        }
    }
}
Записан

MCP, MCAD, MCTS:Win, MCTS:Web
xelos
Гость
« Ответ #1 : 12-04-2005 18:57 » 

ты половину кода выкинул?

как ты присобачиваешь функцию serialPort1_ReceivedEvent к serialPort1?

этот эксепшн постоянно вылетает или иногда?
Записан
MOPO3
Ай да дэдушка! Вах...
Команда клуба

lt
Offline Offline
Пол: Мужской
Холадна аднака!


WWW
« Ответ #2 : 13-04-2005 04:35 » 

ты половину кода выкинул?
Да нет, не выкидывал. Только запостил код файла Form1.cs
Весь проект состоит из 2 файлов : Form1.cs и Programm.cs
Вот их полные листинги :
Programm.cs
Код:
#region Using directives

using System;
using System.Collections.Generic;
using System.Windows.Forms;

#endregion

namespace SerialTest
{
    static class Program
    {
        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.EnableRTLMirroring();
            Application.Run(new Form1());
        }
    }
}

Form1.cs
Код:
#region Using directives

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Windows.Forms;
using System.IO.Ports;

#endregion

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

        private void button1_Click(object sender, EventArgs e)
        {
            if (serialPort1.IsOpen)
            {
                serialPort1.Close();
                serialPort1.PortName = "COM1";
            }
            else
            {
                serialPort1.PortName = "COM1";
                serialPort1.Open();
                if (serialPort1.IsOpen)
                {
                    label1.Text = "COM1 Port : port is opened successfully!";
                }
                else
                {
                    label1.Text = "COM1 Port : impossible to open port!";
                }
            }
        }

        private void button2_Click(object sender, EventArgs e)
        {
            serialPort1.Close();
            label1.Text = "COM1 Port : port successfully closed!";
        }

        private void serialPort1_ReceivedEvent(object sender, System.IO.Ports.SerialReceivedEventArgs e)
        {
            string data = serialPort1.ReadLine(); // Вот тут вылетает эксепшн
            label2.Text = data;
        }
    }
}
как ты присобачиваешь функцию serialPort1_ReceivedEvent к serialPort1?

Юзаю Visual Studio 2005 Beta1. Там на вкладке Components есть стандартный компонент SerialPort. Кидаю его на форму и в его эвенте ReceivedEvent создаю  private void serialPort1_ReceivedEvent(object sender, System.IO.Ports.SerialReceivedEventArgs e)

этот эксепшн постоянно вылетает или иногда?

Всегда, когда срабатывает serialPort1_ReceivedEvent
Записан

MCP, MCAD, MCTS:Win, MCTS:Web
xelos
Гость
« Ответ #3 : 13-04-2005 19:14 » 

символ возврата каретки нормально установлен (свойство NewLine)?

не пробовал ReadByte в цикле вместо ReadLine делать?

хотя, судя по эксепшену, попытка несанкционированного доступа из другого потока... впечатление, что порт пытается послать мессагу из своего потока, пользует хэндл твоего окна и это запрещено... не надо ли свойство какое-нить у порта указать, тип IntPtr - и в этом свойстве указать хэндл твоего окна...
« Последнее редактирование: 13-04-2005 19:25 от xelos » Записан
MOPO3
Ай да дэдушка! Вах...
Команда клуба

lt
Offline Offline
Пол: Мужской
Холадна аднака!


WWW
« Ответ #4 : 29-04-2005 05:21 » 

Вот принт скрин эксэпшина
И всё же я не пойму никак как это обойти  :oops:

* error.PNG (37.92 Кб - загружено 1091 раз.)
« Последнее редактирование: 29-04-2005 05:35 от MOPO3 » Записан

MCP, MCAD, MCTS:Win, MCTS:Web
MOPO3
Ай да дэдушка! Вах...
Команда клуба

lt
Offline Offline
Пол: Мужской
Холадна аднака!


WWW
« Ответ #5 : 02-05-2005 04:52 » 

Значит так, сделал вот что  :
Код:
private void serialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
   if (InvokeRequired)
   {
        BeginInvoke(new SerialDataReceivedEventHandler(serialPort_DataReceived), new object[] {sender, e});
        return;
    }
    int str_lenght;
    string tmp = "";
    string s = serialPort.ReadExisting();
    str_lenght = s.Length;
    tmp = s.Substring(1, str_lenght-4);
    TerminalWindow.AppendText("Duomenys iš komunikacinio prievado : " + tmp + "\n");
     DoLog("Duomenys iš komunikacinio prievado : " + tmp + "\n");
}
В итоге вроде работает Улыбаюсь
Записан

MCP, MCAD, MCTS:Win, MCTS:Web
MOPO3
Ай да дэдушка! Вах...
Команда клуба

lt
Offline Offline
Пол: Мужской
Холадна аднака!


WWW
« Ответ #6 : 02-05-2005 06:17 » 

В том то и дело что вроде Улыбаюсь
Если данные из порта идут быстро, то получаю следующий эксепшн :
Цитата
System.Reflection.TargetInvocationException was unhandled
  Message="Exception has been thrown by the target of an invocation."

С описанием :
Цитата
Function evaluation disabled because a previous function evaluation timed out. You must continue execution to reenable function evaluation.

То бишь чего я ещё не сделал ?
Записан

MCP, MCAD, MCTS:Win, MCTS:Web
MOPO3
Ай да дэдушка! Вах...
Команда клуба

lt
Offline Offline
Пол: Мужской
Холадна аднака!


WWW
« Ответ #7 : 02-05-2005 07:53 » 

Всё, разобрался. Проблема была в неправильно установленом свойстве RecievedBytesThreshold и поэтому далее в коде происходила ошибка в моей функции обсчёта и вывода данных Улыбаюсь
Теперь всё ок.
Записан

MCP, MCAD, MCTS:Win, MCTS:Web
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines