На главную
ПРАВИЛА FAQ Помощь Участники Календарь Избранное DigiMania RSS
msm.ru
Модераторы: maxim84_, juice
  
> Работа с компонентом SerialPort
    В практике часто требуется найти решение на тот или иной вопрос, но не всегда ответ очевиден. Вот так же случилось у меня. В работе столкнулся с тем что надо принять данные с СОМ порта, ну что же подумал я, плевое дело. Бросил на форму компонент SerialPort и ListBox, в событии serialPort1_DataReceived задал для listBox1 новый итем с данными из СОМ порта, код выглядел так:

    ExpandedWrap disabled
      private void Form1_Load(object sender, EventArgs e)
              {
                  serialPort1.Open();  //открываем порт
       
              }
       
              private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
              {
                  listBox1.Items.Add(serialPort1.ReadLine());  //получаем данные
              }


    Все просто до безобразия, но запустив проект я не увидел никаких данных. Написал подобный проект на Borland C++ Builder6, там все работало. После долгих поисков нашол кусок кода для работы с СОМ портом, помоему на www.codeproject.com, который натолкнул на мысль и появилась реализация через Callback посылку данных с порта на ListBox. Код этого метода ниже

    ExpandedWrap disabled
      using System;
      using System.Collections.Generic;
      using System.ComponentModel;
      using System.Data;
      using System.Drawing;
      using System.Text;
      using System.Windows.Forms;
      using System.IO.Ports;
       
      namespace SerrialPortReader
      {
          public partial class Form1 : Form
          {
              
              string InputData = String.Empty;
              delegate void SetTextCallback(string text); //объявляем делегата для Callback метода
       
              public Form1()
              {
                  InitializeComponent();
              }
       
              private void Form1_Load(object sender, EventArgs e)
              {
                  // получаем список СОМ портов системы
                  string[] ports = SerialPort.GetPortNames();
                  foreach (string port in ports)
                  {
                     comboBox1.Items.Add(port);
                  }
              }
       
              void AddData(string text)
              {
       
                  listBox1.Items.Add(text); //отображаем полученные данные
              }
       
              private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
              {
                  InputData = port.ReadExisting();
                  if (InputData != String.Empty)
                  {
                      SetText(InputData);
                  }
                  
              }
       
              private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
              {
                  if (comboBox1.Text != "")
                  {
                      groupBox2.Enabled = true;
                      button1.Enabled = true;
                  }
                  else
                  {
                      groupBox2.Enabled = false;
                      button1.Enabled = false;
                  }
              }
       
              private void button1_Click(object sender, EventArgs e)
              {
                  if (button1.Text == "Старт")
                  {
                      if (port.IsOpen) port.Close();
       
                      #region Задаем параметры порта
                      port.PortName = comboBox1.Text;
                      port.BaudRate = Convert.ToInt32(comboBox2.Text);
                      port.DataBits = Convert.ToInt32(comboBox3.Text);
                      switch (comboBox4.Text)
                      {
                          case "Пробел":
                              port.Parity = Parity.Space;
                              break;
                          case "Чет":
                              port.Parity = Parity.Even;
                              break;
                          case "Нечет":
                              port.Parity = Parity.Odd;
                              break;
                          case "Маркер":
                              port.Parity = Parity.Mark;
                              break;
                          default:
                              port.Parity = Parity.None;
                              break;
                      }
                      switch (comboBox5.Text)
                      {
                          case "2":
                              port.StopBits = StopBits.Two;
                              break;
                          case "1.5":
                              port.StopBits = StopBits.OnePointFive;
                              break;
                          case "Нет":
                              port.StopBits = StopBits.None;
                              break;
                          default:
                              port.StopBits = StopBits.One;
                              break;
                      }
                      switch (comboBox6.Text)
                      {
                          case "Xon/Xoff":
                              port.Handshake = Handshake.XOnXOff;
                              break;
                          case "Аппаратное":
                              port.Handshake = Handshake.RequestToSend;
                              break;
                          default:
                              port.Handshake = Handshake.None;
                              break;
                      }
                      #endregion
       
                      try
                      {
                          port.Open();
                          button1.Text = "Стоп";
                          button2.Enabled = false;
                      }
                      catch
                      {
                          MessageBox.Show("Порт " + port.PortName + " невозможно открыть!", "Ошибка!", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                          comboBox1.SelectedText = "";
                          button1.Text = "Старт";
                          
                      }
                      
                  }
                  else
                  {
                      if (port.IsOpen) port.Close();
                      button1.Text = "Старт";
                      button2.Enabled = true;
                  }
       
              }
       
       
              //соответственно сам метод нашего Callback'а
              private void SetText(string text )
              {
       
                  if (this.listBox1.InvokeRequired)
                  {
                      SetTextCallback d = new SetTextCallback(SetText);
                      this.Invoke(d, new object[] { text });
                  }
                  else
                  {
                      this.AddData(text);
                      
                  }
              }
              //корректно завершаем работу программы
              private void Form1_FormClosing(object sender, FormClosingEventArgs e)
              {
                  button1.Text = "Стоп";
                  Application.DoEvents();
                  button1_Click(sender, e);
                  Application.DoEvents();
              }



    В аттаче проект программы позволяющий просматривать данные с СОМ порта
    Прикреплённый файлПрикреплённый файлSerrialPortReader.rar (13.86 Кбайт, скачиваний: 2160)
    Истина где-то рядом!?!
      Вот я тоже столкнулся в работе с необходимостью получать данные с ком-порта, нашел Ваш пост, скачал прогу и она "естественно" не работает. вот тчо выдает output:
      'SerrialPortReader.vshost.exe' (Managed): Loaded 'J:\WINDOWS\assembly\GAC_64\mscorlib\2.0.0.0__b77a5c561934e089\mscorlib.dll', Skipped loading symbols. Module is optimized and the debugger option 'Just My Code' is enabled.
      'SerrialPortReader.vshost.exe' (Managed): Loaded 'J:\WINDOWS\assembly\GAC_MSIL\Microsoft.VisualStudio.HostingProcess.Utilities\8.0.0.0__b03f5f7f11d50a3a\Microsoft.VisualStudio.HostingProcess.Utilities.dll', Skipped loading symbols. Module is optimized and the debugger option 'Just My Code' is enabled.
      'SerrialPortReader.vshost.exe' (Managed): Loaded 'J:\WINDOWS\assembly\GAC_MSIL\System.Windows.Forms\2.0.0.0__b77a5c561934e089\System.Windows.Forms.dll', Skipped loading symbols. Module is optimized and the debugger option 'Just My Code' is enabled.
      'SerrialPortReader.vshost.exe' (Managed): Loaded 'J:\WINDOWS\assembly\GAC_MSIL\System\2.0.0.0__b77a5c561934e089\System.dll', Skipped loading symbols. Module is optimized and the debugger option 'Just My Code' is enabled.
      'SerrialPortReader.vshost.exe' (Managed): Loaded 'J:\WINDOWS\assembly\GAC_MSIL\System.Drawing\2.0.0.0__b03f5f7f11d50a3a\System.Drawing.dll', Skipped loading symbols. Module is optimized and the debugger option 'Just My Code' is enabled.
      'SerrialPortReader.vshost.exe' (Managed): Loaded 'J:\WINDOWS\assembly\GAC_MSIL\Microsoft.VisualStudio.HostingProcess.Utilities.Sync\8.0.0.0__b03f5f7f11d50a3a\Microsoft.VisualStudio.HostingProcess.Utilities.Sync.dll', Skipped loading symbols. Module is optimized and the debugger option 'Just My Code' is enabled.
      'SerrialPortReader.vshost.exe' (Managed): Loaded 'J:\Documents and Settings\Administrator\Desktop\Migel\SerrialPortReader\SerrialPortReader2\bin\Debug\SerrialPortReader.vshost.exe', Skipped loading symbols. Module is optimized and the debugger option 'Just My Code' is enabled.
      'SerrialPortReader.vshost.exe' (Managed): Loaded 'J:\WINDOWS\assembly\GAC_64\System.Data\2.0.0.0__b77a5c561934e089\System.Data.dll', Skipped loading symbols. Module is optimized and the debugger option 'Just My Code' is enabled.
      'SerrialPortReader.vshost.exe' (Managed): Loaded 'J:\WINDOWS\assembly\GAC_MSIL\System.Deployment\2.0.0.0__b03f5f7f11d50a3a\System.Deployment.dll', Skipped loading symbols. Module is optimized and the debugger option 'Just My Code' is enabled.
      'SerrialPortReader.vshost.exe' (Managed): Loaded 'J:\WINDOWS\assembly\GAC_MSIL\System.Xml\2.0.0.0__b77a5c561934e089\System.Xml.dll', Skipped loading symbols. Module is optimized and the debugger option 'Just My Code' is enabled.
      The thread 0x8cc has exited with code 0 (0x0).
      'SerrialPortReader.vshost.exe' (Managed): Loaded 'J:\Documents and Settings\Administrator\Desktop\Migel\SerrialPortReader\SerrialPortReader2\bin\Debug\SerrialPortReader.exe', Symbols loaded.
      The thread 0x914 has exited with code 0 (0x0).
      The thread 0xb38 has exited with code 0 (0x0).
      The thread 0xc40 has exited with code 0 (0x0).
      The program '[3896] SerrialPortReader.vshost.exe: Managed' has exited with code 0 (0x0).
      подскажите, пожалуйста, что делать!
        если можно немного подробней что вы пытаетесь сделать, и где именно программа падает.
        Истина где-то рядом!?!
          Для работы с serial port есть более продвинутые средства библиотека boost написаная на с++ кросплатформенна в этом есть много преимуществ. Там есть средства для работы с com port очень хорошая статью по этой совместной работе boost и serial port чтении и передачи данных можно найти здесь http://robot-develop.org/archives/450
            Цитата lord.tiran @
            Для работы с serial port есть более продвинутые средства библиотека boost написаная на с++ кросплатформенна в этом есть много преимуществ. Там есть средства для работы с com port очень хорошая статью по этой совместной работе boost и serial port чтении и передачи данных можно найти здесь http://robot-develop.org/archives/450

            Осталось только как то притянуть сюда .NET ))))
            Ни один победитель не верит в случайность.
              Почему "запустив проект вы не увидели никаких данных"? Я запускаю программу на с# для передачи данных по сом-порту и тоже ничего не вижу. Пишет "Доступ к порту 'СОМ1' закрыт"". А аналогичная программа , но написанная на С ++ работать будет?
                стал делать код как у Вас.
                Столкнулся с такой проблемой:
                1. добавил код по отправке данных

                ExpandedWrap disabled
                  private void send_Click(object sender, EventArgs e)
                          {
                              //отправляем сообщение
                              portRS232.WriteLine("5");
                              listBoxRX.Items.Add(dataRX);          
                          }


                2. На com порту замыкаю TX на RX
                3. Принимаю данные:
                ExpandedWrap disabled
                   private void portRS232_DataReceived(object sender, SerialDataReceivedEventArgs e)
                          {
                              dataRX = portRS232.ReadExisting();
                              listBoxRX.Items.Add(dataRX);
                          }

                И тут возникает такое исключение:

                В вашем исходном коде так же.
                Причем если запускать программу не из VS, то все вобщем то работает. Число 5 приходит нормально отображается в listBox.
                Среда VS2010 Express.

                Прикреплённая картинка
                Прикреплённая картинка
                Сообщение отредактировано: maxim84_ -
                  внимательно рассмотрел и понял что сделал не как у Вас.
                  Переделал прием сообщений как у вас и все заработало.
                  А можно подробные комментарии к этому коду?
                  ExpandedWrap disabled
                    private void SetText(string text)
                            {
                     
                                if (this.listBox1.InvokeRequired)
                                {
                                    SetTextCallback d = new SetTextCallback(SetText);
                                    this.Invoke(d, new object[] { text });
                                }
                                else
                                {
                                    this.AddData(text);
                                    
                                }
                            }
                  Сообщение отредактировано: maxim84_ -
                  0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                  0 пользователей:


                  Рейтинг@Mail.ru
                  [ Script Execution time: 0,1281 ]   [ 20 queries used ]   [ Generated: 18.11.17, 06:50 GMT ]