Как автоматически определить 3 различных устройства, подключаемых к трём раздичным COM портам - C#

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

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

Как автоматически определить 3 различных устройства, подключаемых к трём разным COM портам, работающим на разной скорости. На форме создал три SerialPort. У каждого своя скорость: 115200 (подключаю плату с ПЛИС), 9600 (мультиметр) и 2400 (DC источник). Вот пример как делаю для одного из COM портов (для остальных аналогично):
private void port2_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            port2.Read(InputData2, 0, 1);     // считываем в массив
            SetText2(InputData2);
        }
 
        private void SetText2(byte[] bt_in)
        {
 
            if (this.txtIn.InvokeRequired)
            {
                SetTextCallback d = new SetTextCallback(SetText2);
                this.Invoke(d, new object[] { bt_in });
            }
            else this.txtIn.Text += Convert.ToString(bt_in[0]) + "\t";
            strdata2 = this.txtIn.Text;
        }
//-----------------------------------------------------------------------------------------------------------------------------//
//----------------------------------------------------- Нажатие на checkBox1 --------------------------------------------------//
//-----------------------------------------------------------------------------------------------------------------------------//
        private void checkBox1_CheckedChanged(object sender, EventArgs e)   // подключение port1 - плата MUX
        {
            string[] ports = SerialPort.GetPortNames();
            if (checkBox1.Checked == true)
            {
                checkBox1.Text = "Disconnect plate";
                for (int i = 0; i < ports.Length; i++)
                {
                    Array.Clear(InputData1, 0, 1);    // очищаем масив
                    if (i >= ports.Length)
                    {
                        break;
                    }
                    if (port1.IsOpen)
                    {
                        port1.Close();
                    }
                    if ((ports[i] != port2.PortName) && (ports[i] != port3.PortName))
                    {
                        port1.PortName = ports[i];
                        try
                        {
                            port1.Open();
                            if (port1.IsOpen)
                            {
                                bt[0] = 51;                         // "00110011"
                                port1.Write(bt, 0, 1);
                                Thread.Sleep(50);                   // ожидание
                                if (port1.IsOpen)
                                    if ((InputData1[0] == Convert.ToInt32("00110011", 2)) || (InputData1[0] == Convert.ToInt32("01101010", 2)))
                                    {
                                        label1.Text = port1.PortName; // +": 115200,8N1";
                                        label1.Visible = true;
                                        tabControl1.Enabled = true;
                                        break;
                                    }
                            }
                        }
                        catch (Exception X)
                        {
                        }
                    }
                }
                if ((label1.Visible == false) || (label1.Text == "Not found"))
                {
                    checkBox1.Checked = false;
                    checkBox1.Text = "Connect to plate";
                    label1.Text = "Not found";
                    label1.Visible = true;
                }
            }
            else
            {
                if (port1.IsOpen)
                    port1.Close();
                port1.PortName = "COM";
                label1.Text = "COM";
                label1.Visible = false;
                checkBox1.Text = "Connect to plate";
                tabControl1.Enabled = false;
            }
        }
Периодически происходит зависание программы, в случае, если port для источника с BaudRate 2400 видит плату с ПЛИС 115200. Помогите. плииз, а то в отпук не отпустят вовремя

Решение задачи: «Как автоматически определить 3 различных устройства, подключаемых к трём раздичным COM портам»

textual
Листинг программы
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.IO.Ports;
using System.ComponentModel;
 
namespace PortListner_Demo {
    class PortListner : BackgroundWorker {
        private SerialPort port = null;
        private byte[] answerPattern = null;
        private byte[] askToDevice = null;
 
        public PortListner(string name, int baud, byte[] answer, byte[] ask ) {
            this.WorkerReportsProgress = true;
            this.WorkerSupportsCancellation = true;
 
            port = new SerialPort(name, baud);
            answerPattern = answer;
            askToDevice = ask;
        }
        protected override void OnDoWork(DoWorkEventArgs e) {
            List<byte> temp = new List<byte>();
            using (port) {
                port.Open();
                ReadBlock(askToDevice, temp, answerPattern.Length);
                if (string.Join("", answerPattern.Select(b => b.ToString())).CompareTo(
                    string.Join("", temp.Select(b => b.ToString()))) == 0) {
                    e.Result = "Device answerd correct!";
                }
                else {
                    e.Result = "Wrong answer from device!";
                }                              
            }
        }
        void ReadBlock(byte[] dataToWrite, List<byte> dataForRead, int readSize) {
            for (int i = 0; i < 10; i++) {
                port.DiscardInBuffer();
                port.Write(dataToWrite, 0, dataToWrite.Length);
                for (int j = 0; j < 10; j++) {
                    if (port.BytesToRead == readSize) {
                        byte[] data = new byte[readSize];
                        port.Read(data, 0, readSize);
                        dataForRead.AddRange(data);
                        return;
                    }
                    Thread.Sleep(100);
                }
            }
            throw new TimeoutException("Device not answers!");
        }
    }
}

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


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

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

14   голосов , оценка 4 из 5
Похожие ответы