Не получается вывести данные с COM-порта в окне - C#

Узнай цену своей работы

Формулировка задачи:

Всем привет! Изучаю C#. Разбираю работу с COM-портом. Задача: проверить какие COM-порты есть в системе и вывести их в ComboBox, пропинговать внешнее устройство, открыть порт, записать данные, считать данные, вывести считанные данные в окне, закрыть порт. Разобрал массу примеров. В итоге получилось реализовать все, кроме вывода считанных данных в окне. По миганию светодиодов в устройстве вижу, что данные на открытие и закрытие проходят. А вот увидеть получаемые данные не могу. Пробовал подключать стандартные программы работы с COM-портами - устройство возвращает данные в COM-порт в ответ на посылку. Подскажите, пожалуйста, где и что я не так делаю? Код:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO.Ports;
using System.IO;
 
namespace Port_1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
 
        private void Form1_Load(object sender, EventArgs e)
        {
            string[] enableComPorts = SerialPort.GetPortNames();
 
            foreach (string port in enableComPorts)
            {
                comboBox1.Items.Add(port);
            }
 
        }
 
        private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
        {
            //comboBox1.Text = comboBox1.SelectedItem.ToString();
            //serialPort1.PortName = comboBox1.Text;
        }
 
        private void ButConnect_Click(object sender, EventArgs e)
        {
 
            if (serialPort1.IsOpen)    // если порт открыт      
            {
                serialPort1.Close();     // закрыть
            }
 
            else
            {                                                // если закрыт , открываем 
 
                serialPort1.PortName = ((string)comboBox1.SelectedItem);
                serialPort1 = new SerialPort(serialPort1.PortName, 112000, Parity.None, 8, StopBits.One);
 
                {
                    try
                    {
                        serialPort1.Open();
                        if (serialPort1.IsOpen)
                        {
                            ButConnect.Enabled = false;
                            ButDisconnect.Enabled = true;
                        }
                    }
                    catch (Exception e1)
                    {
                        MessageBox.Show(e1.Message);
                    }
                    //Передаю команду Connect
                    byte[] data = { 11, 22, 00, 00, 00 };
                    serialPort1.Write(data, 0, data.Length);
                }
 
            }
        }
        
        //private string stroka = ""; 
        //private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
        //{
        //    this.Invoke(new EventHandler(DoUpdate));
        //}
        //private void DoUpdate(object s, EventArgs e)
        //{
        //    stroka = stroka + serialPort1.ReadExisting();
        //}

        //****** поток ком порта
        private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
        {
            string command = serialPort1.ReadLine();
            this.BeginInvoke(new LineReceivedEvent(LineReceived), command);
        }
        private delegate void LineReceivedEvent(string command);
        private void LineReceived(string command)
        {
            listBox1.Text = command;
        }
 
        private void ButDisconnect_Click (object sender, EventArgs e)
        {
            try
            {
                //Передаю команду Disconnect
                byte[] data = { 22, 11, 00, 00, 00 };
                serialPort1.Write(data, 0, data.Length);
 
                serialPort1.Close();
                if (serialPort1.IsOpen)
                {
                }
                else
                {
                    ButConnect.Enabled = true;
                    ButDisconnect.Enabled = false;
                }
            }
            catch (Exception e2)
            {
                MessageBox.Show(e2.Message);
            }
        }
        //Закрываем порт при закрытии окна программы программы
        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            byte[] data = { 01,02,00,00,00,00,00,00,00 };
            serialPort1.Write(data, 0, data.Length);
            serialPort1.Close();
        }
 
        private void textBox1_TextChanged(object sender, EventArgs e)
        {
        }
 
        private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
        {
        }
    }
}
Все стабильно работает, но что-то не могу врубиться: 1.сначала я отправляю данные (5 байт) в устройство, затем мне необходимо читать полученные в ответ данные; как увязать отправку и получение данных? 2.как вывести считанные данные из переменной в окне? Перепробовал код из примеров, найденных в сети - либо выдает ошибки, либо не выводит принятые данные. Буду признателен, если покажете кусок кода и/или объясните. Всем спасибо.

Решение задачи: «Не получается вывести данные с COM-порта в окне»

textual
Листинг программы
byte[] array = new byte[port.BytesToRead];
                    port.Read(array, 0, port.BytesToRead);

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

6   голосов , оценка 4.333 из 5