Как вы можете отправить c# из данных последовательного порта и после на дискотеку nnet и восстановить соединение без сбоев? - PullRequest
0 голосов
/ 12 февраля 2020
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. Вместо этого я получаю следующую ошибку: «Операция ввода-вывода была прервана из-за выхода из потока или запроса приложения».

...