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

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

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

Всем привет! Изучаю C#. Разбираю работу с COM-портом. Задача: проверить какие COM-порты есть в системе и вывести их в ComboBox, пропинговать внешнее устройство, открыть порт, записать данные, считать данные, вывести считанные данные в окне, закрыть порт. Разобрал массу примеров. В итоге получилось реализовать все, кроме вывода считанных данных в окне. По миганию светодиодов в устройстве вижу, что данные на открытие и закрытие проходят. А вот увидеть получаемые данные не могу. Пробовал подключать стандартные программы работы с COM-портами - устройство возвращает данные в COM-порт в ответ на посылку. Подскажите, пожалуйста, где и что я не так делаю? Код:
Листинг программы
  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.Linq;
  7. using System.Text;
  8. using System.Threading.Tasks;
  9. using System.Windows.Forms;
  10. using System.IO.Ports;
  11. using System.IO;
  12. namespace Port_1
  13. {
  14. public partial class Form1 : Form
  15. {
  16. public Form1()
  17. {
  18. InitializeComponent();
  19. }
  20. private void Form1_Load(object sender, EventArgs e)
  21. {
  22. string[] enableComPorts = SerialPort.GetPortNames();
  23. foreach (string port in enableComPorts)
  24. {
  25. comboBox1.Items.Add(port);
  26. }
  27. }
  28. private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
  29. {
  30. //comboBox1.Text = comboBox1.SelectedItem.ToString();
  31. //serialPort1.PortName = comboBox1.Text;
  32. }
  33. private void ButConnect_Click(object sender, EventArgs e)
  34. {
  35. if (serialPort1.IsOpen) // если порт открыт
  36. {
  37. serialPort1.Close(); // закрыть
  38. }
  39. else
  40. { // если закрыт , открываем
  41. serialPort1.PortName = ((string)comboBox1.SelectedItem);
  42. serialPort1 = new SerialPort(serialPort1.PortName, 112000, Parity.None, 8, StopBits.One);
  43. {
  44. try
  45. {
  46. serialPort1.Open();
  47. if (serialPort1.IsOpen)
  48. {
  49. ButConnect.Enabled = false;
  50. ButDisconnect.Enabled = true;
  51. }
  52. }
  53. catch (Exception e1)
  54. {
  55. MessageBox.Show(e1.Message);
  56. }
  57. //Передаю команду Connect
  58. byte[] data = { 11, 22, 00, 00, 00 };
  59. serialPort1.Write(data, 0, data.Length);
  60. }
  61. }
  62. }
  63. //private string stroka = "";
  64. //private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
  65. //{
  66. // this.Invoke(new EventHandler(DoUpdate));
  67. //}
  68. //private void DoUpdate(object s, EventArgs e)
  69. //{
  70. // stroka = stroka + serialPort1.ReadExisting();
  71. //}
  72.  
  73. //****** поток ком порта
  74. private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
  75. {
  76. string command = serialPort1.ReadLine();
  77. this.BeginInvoke(new LineReceivedEvent(LineReceived), command);
  78. }
  79. private delegate void LineReceivedEvent(string command);
  80. private void LineReceived(string command)
  81. {
  82. listBox1.Text = command;
  83. }
  84. private void ButDisconnect_Click (object sender, EventArgs e)
  85. {
  86. try
  87. {
  88. //Передаю команду Disconnect
  89. byte[] data = { 22, 11, 00, 00, 00 };
  90. serialPort1.Write(data, 0, data.Length);
  91. serialPort1.Close();
  92. if (serialPort1.IsOpen)
  93. {
  94. }
  95. else
  96. {
  97. ButConnect.Enabled = true;
  98. ButDisconnect.Enabled = false;
  99. }
  100. }
  101. catch (Exception e2)
  102. {
  103. MessageBox.Show(e2.Message);
  104. }
  105. }
  106. //Закрываем порт при закрытии окна программы программы
  107. private void Form1_FormClosing(object sender, FormClosingEventArgs e)
  108. {
  109. byte[] data = { 01,02,00,00,00,00,00,00,00 };
  110. serialPort1.Write(data, 0, data.Length);
  111. serialPort1.Close();
  112. }
  113. private void textBox1_TextChanged(object sender, EventArgs e)
  114. {
  115. }
  116. private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
  117. {
  118. }
  119. }
  120. }
Все стабильно работает, но что-то не могу врубиться: 1.сначала я отправляю данные (5 байт) в устройство, затем мне необходимо читать полученные в ответ данные; как увязать отправку и получение данных? 2.как вывести считанные данные из переменной в окне? Перепробовал код из примеров, найденных в сети - либо выдает ошибки, либо не выводит принятые данные. Буду признателен, если покажете кусок кода и/или объясните. Всем спасибо.

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

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

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


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

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

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

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут