Не получается вывести данные с COM-порта в окне - C#
Формулировка задачи:
Всем привет! Изучаю C#. Разбираю работу с COM-портом.
Задача: проверить какие COM-порты есть в системе и вывести их в ComboBox, пропинговать внешнее устройство, открыть порт, записать данные, считать данные, вывести считанные данные в окне, закрыть порт.
Разобрал массу примеров. В итоге получилось реализовать все, кроме вывода считанных данных в окне. По миганию светодиодов в устройстве вижу, что данные на открытие и закрытие проходят. А вот увидеть получаемые данные не могу.
Пробовал подключать стандартные программы работы с COM-портами - устройство возвращает данные в COM-порт в ответ на посылку.
Подскажите, пожалуйста, где и что я не так делаю?
Код:
Все стабильно работает, но что-то не могу врубиться:
1.сначала я отправляю данные (5 байт) в устройство, затем мне необходимо читать полученные в ответ данные; как увязать отправку и получение данных?
2.как вывести считанные данные из переменной в окне?
Перепробовал код из примеров, найденных в сети - либо выдает ошибки, либо не выводит принятые данные.
Буду признателен, если покажете кусок кода и/или объясните.
Всем спасибо.
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)
{
}
}
}Решение задачи: «Не получается вывести данные с COM-порта в окне»
textual
Листинг программы
byte[] array = new byte[port.BytesToRead]; port.Read(array, 0, port.BytesToRead);