Как автоматически определить 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!");
}
}
}