Как автоматически определить 3 различных устройства, подключаемых к трём раздичным COM портам - C#
Формулировка задачи:
Как автоматически определить 3 различных устройства, подключаемых к трём разным COM портам, работающим на разной скорости.
На форме создал три SerialPort.
У каждого своя скорость: 115200 (подключаю плату с ПЛИС), 9600 (мультиметр) и 2400 (DC источник).
Вот пример как делаю для одного из COM портов (для остальных аналогично):
Периодически происходит зависание программы, в случае, если port для источника с BaudRate 2400 видит плату с ПЛИС 115200.
Помогите. плииз, а то в отпук не отпустят вовремя
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; } }
Решение задачи: «Как автоматически определить 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!"); } } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д