Как отправлять данные через последовательный порт одновременно при непрерывном получении данных через последовательный порт в C# - PullRequest
0 голосов
/ 26 апреля 2020

В моем проекте я посылаю команду запуска (кнопка ON в форме Win) из c# в Arduino, и Arduino начинает вращать серводвигатель. Также Arduino отправляет положение сервопривода обратно в мою C# форму выигрыша при вращении сервопривода , Теперь мне нужно отправить еще одну команду в Arduino, но я не могу получить доступ к COM-порту, так как Arduino отправляет данные на постоянной основе (я использую DataReceiveHandler в c#) . Так что вы можете мне помочь в этом как прервать Arduino на время и получить доступ к COM-порту ??

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO.Ports;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WindowsFormsApplication2
{
    public partial class Serial_comm_1 : Form
    {
        private static int temp;
        private DateTime Datetime;
        string indata;
        //int var = temp;

        public Serial_comm_1()
        {
            InitializeComponent();
            string Port_Name = "COM3";    // Store the selected COM port name to "Port_Name" varaiable
            int Baud_Rate = 9600; // Convert the string "9600" to int32 9600
            SerialPort COMport = new SerialPort(Port_Name, Baud_Rate);
            COMport.Parity = Parity.None;
            COMport.StopBits = StopBits.One;
            COMport.DataBits = 8;
            COMport.Handshake = Handshake.None;
            COMport.RtsEnable = true;
            COMport.DtrEnable = true;
            COMport.Close();

            // COMport.Open();
            // Console.WriteLine(COMport.IsOpen);

        }



        private void Button_Transmit_Data_Click(object sender, EventArgs e)
        {
              //Local Variables
            string Port_Name = "COM3";    // Store the selected COM port name to "Port_Name" varaiable
            int Baud_Rate = 9600; // Convert the string "9600" to int32 9600
            string Data = TextBox_Transmit_Data.Text;                             //Store the string in Textbox to variable "Data"

            SerialPort COMport = new SerialPort(Port_Name,Baud_Rate); //Create a new  SerialPort Object (defaullt setting -> 8N1)

            COMport.ReadTimeout = 3500; //Setting ReadTimeout =3500 ms or 3.5 seconds


            //try to Open SerialPort
            try
            {
                COMport.Open();
                textBox_System_Log.Text = "";
            }
            #region  
           catch (UnauthorizedAccessException SerialException) //exception that is thrown when the operating system denies access 
            {
                MessageBox.Show(SerialException.ToString());
                textBox_System_Log.Text = Port_Name + Environment.NewLine + Baud_Rate;
                textBox_System_Log.Text = textBox_System_Log.Text + Environment.NewLine + SerialException.ToString();
                COMport.Close();
            }

            catch (System.IO.IOException SerialException)     // An attempt to set the state of the underlying port failed
            {
                MessageBox.Show(SerialException.ToString());
                textBox_System_Log.Text = Port_Name + Environment.NewLine + Baud_Rate;
                textBox_System_Log.Text = textBox_System_Log.Text + Environment.NewLine + SerialException.ToString();
                COMport.Close();
            }

           catch (InvalidOperationException SerialException) // The specified port on the current instance of the SerialPort is already open
            {
                MessageBox.Show(SerialException.ToString());
                textBox_System_Log.Text = Port_Name + Environment.NewLine + Baud_Rate;
                textBox_System_Log.Text = textBox_System_Log.Text + Environment.NewLine + SerialException.ToString();
                COMport.Close();
            }

            catch //Any other ERROR
            {
                MessageBox.Show("ERROR in Opening Serial PORT -- UnKnown ERROR");
                COMport.Close();
            }
            #endregion

            //If we are able to open the port 
            if (COMport.IsOpen == true)
            {

                COMport.WriteLine(Data);                // Send Data

                textBox_System_Log.Text = Port_Name + Environment.NewLine + Baud_Rate;
                textBox_System_Log.Text = textBox_System_Log.Text + Environment.NewLine + Data + "  Written to Port"+ Environment.NewLine;
                //COMport.Close();


            }
            else
            {
                TextBox_Received_Data.Enabled = true; // Enable the Receive Groupbox
                MessageBox.Show("Unable to Write to COM port ");
                COMport.Close();

            }



        }

        private void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e)
        {


               SerialPort sp = (SerialPort)sender;

                indata = sp.ReadLine();
                this.Invoke(new EventHandler(display_data_event));


        }

        private void display_data_event(object sender, EventArgs e)
        {
            Datetime = DateTime.Now;
            String time = Datetime.Hour + ":" + Datetime.Minute + ":" + Datetime.Second;
            textBox_System_Log.AppendText(time + "\t\t\t" + indata + Environment.NewLine);

        }

        private void Form1_Load(object sender, EventArgs e)
        {

        }

        private void label1_Click(object sender, EventArgs e)
        {

        }

        private void textBox_Received_Data_TextChanged(object sender, EventArgs e)
        {

        }

        private void TextBox_Transmit_Data_TextChanged(object sender, EventArgs e)
        {


        }


    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...