public partial class Form1 : Form
{
delegate void SetTextCallback(string text);
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
string[] ports = SerialPort.GetPortNames();
cmbPort.Items.AddRange(ports);
cmbPort.SelectedIndex = 0;
btnDisconnect.Enabled = false;
}
private void Form1_FormClosed(object sender, FormClosedEventArgs e)
{
if (serialPort!= null && serialPort.IsOpen)
{
serialPort.DataReceived -= DataReceivedEvent;
serialPort.Close();
}
}
private void BtnConnect_Click(object sender, EventArgs e)
{
btnConnect.Enabled = false;
btnDisconnect.Enabled = true;
try
{
serialPort.PortName = cmbPort.Text;
serialPort.DataReceived += DataReceivedEvent;
serialPort.Open();
}
catch(Exception ex)
{
MessageBox.Show(ex.Message, "Message", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void BtnDisconnect_Click(object sender, EventArgs e)
{
btnConnect.Enabled = true;
btnDisconnect.Enabled = false;
try
{
serialPort.DataReceived -= DataReceivedEvent;
serialPort.Close();
}
catch(Exception ex)
{
MessageBox.Show(ex.Message, "Message", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
void DataReceivedEvent(object sender, SerialDataReceivedEventArgs e)
{
if (serialPort.IsOpen == true)
{
int suma = 0;
SerialPort senderPort = (SerialPort) sender;
byte[] buffer = new byte[2];
if (senderPort.Read(buffer, 0, 2) != 0)
{
int val_magica1 = (int) (buffer[0]);
suma += val_magica1;
if (val_magica1 == 100)
{
if (senderPort.Read(buffer, 0, 2) != 0)
{
int val_magica2 = (int) (buffer[0]);
suma += val_magica2;
if (val_magica2 == 98)
if (senderPort.Read(buffer, 0, 2) != 0)
{
int poz = (int) (buffer[0]);
suma += poz;
if (poz == 1)
if (senderPort.Read(buffer, 0, 2) != 0)
{
int data = (int) (buffer[0]);
suma += data;
if (senderPort.Read(buffer, 0, 2) != 0)
{
int suma_primita = (int) (buffer[0]);
suma = suma % 256;
Console.WriteLine("Suma soft1: " + suma);
Console.WriteLine("Suma arduino1: " + suma_primita);
if (suma == suma_primita)
{
SetText1(Convert.ToString(data));
}
}
}
if (poz == 2)
if (senderPort.Read(buffer, 0, 2) != 0)
{
int data = (int) (buffer[0]);
suma += data;
if (senderPort.Read(buffer, 0, 2) != 0)
{
int suma_primita = (int) (buffer[0]);
suma = suma % 256;
Console.WriteLine("Suma soft2: " + suma);
Console.WriteLine("Suma arduino2: " + suma_primita);
if (suma == suma_primita)
SetText2(Convert.ToString(data));
}
}
if (poz == 3)
if (senderPort.Read(buffer, 0, 2) != 0)
{
int data = (int) (buffer[0]);
suma += data;
if (senderPort.Read(buffer, 0, 2) != 0)
{
int suma_primita = (int) (buffer[0]);
suma = suma % 256;
Console.WriteLine("Suma soft3: " + suma);
Console.WriteLine("Suma arduino3: " + suma_primita);
if (suma == suma_primita)
SetText3(Convert.ToString(data));
}
}
if (poz == 4)
if (senderPort.Read(buffer, 0, 2) != 0)
{
int data = (int) (buffer[0]);
suma += data;
if (senderPort.Read(buffer, 0, 2) != 0)
{
int suma_primita = (int) (buffer[0]);
suma = suma % 256;
Console.WriteLine("Suma soft4: " + suma);
Console.WriteLine("Suma arduino4: " + suma_primita);
if (suma == suma_primita)
SetText4(Convert.ToString(data));
}
}
}
}
}
}
}
return;
serialPort.ReadTimeout = 500;
}
private void SetText1(string text)
{
if (this.afisare1.InvokeRequired)
{
try
{
SetTextCallback d = new SetTextCallback(SetText1);
this.Invoke(d, new object[] { text });
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Message", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
else
{
this.afisare1.Text = text;
}
}
private void SetText2(string text)
{
if (this.afisare2.InvokeRequired)
{
try
{
SetTextCallback d = new SetTextCallback(SetText2);
this.Invoke(d, new object[] { text });
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Message", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
else
{
this.afisare2.Text = text;
}
}
private void SetText3(string text)
{
if (this.afisare3.InvokeRequired)
{
try
{
SetTextCallback d = new SetTextCallback(SetText3);
this.Invoke(d, new object[] { text });
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Message", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
else
{
this.afisare3.Text = text;
}
}
private void SetText4(string text)
{
if (this.afisare4.InvokeRequired)
{
try
{
SetTextCallback d = new SetTextCallback(SetText4);
this.Invoke(d, new object[] { text });
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Message", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
else
{
this.afisare4.Text = text;
}
}
private void BtnSend_Click(object sender, EventArgs e)
{
byte[] data = Encoding.ASCII.GetBytes(send.Text);
if(serialPort.IsOpen)
serialPort.Write(data,0,0);
}
Приложение представляет собой 4 потенциометра, которые одновременно отправляют данные приложения c#. Все работает нормально, когда я подключаюсь, но когда я пытаюсь отключить его, cra sh, после этого я не могу повторно подключиться, только если я отключаю и снова подключаю USB. Вместо этого я получаю следующую ошибку: «Операция ввода-вывода была прервана из-за выхода из потока или запроса приложения».