C serial communication method

  • 2020-12-07 04:10:56
  • OfStack

An example of C# serial communication is presented in this paper. Share to everybody for everybody reference. The specific methods are as follows:

Data is sent through COM1 and COM2 receives data. When COM2 receives the data sent this time, it sends a message to COM1 to inform COM1 that the data has been sent this time. After receiving the notification, COM1 will send the next paragraph of data. This ensures that the data is received correctly each time it is sent.

The code is as follows:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO.Ports;
using System.Threading;
using Utils; namespace A serial port communication
{
    public partial class Form1 : Form
    {
        #region variable
        /// <summary>
        /// Start or stop, true Starting, false stop
        /// </summary>
        public static bool start = true;
        /// <summary>
        /// A serial port resource
        /// </summary>
        private static SerialPort serialPort1 = null;
        /// <summary>
        /// A serial port resource
        /// </summary>
        private static SerialPort serialPort2 = null;
        /// <summary>
        /// Number of successful
        /// </summary>
        private static int successCount = 0;
        /// <summary>
        /// Number of failures
        /// </summary>
        private static int errorCount = 0;
        /// <summary>
        /// The total number of times we calculated last time
        /// </summary>
        private static int lastCount = 0;
        /// <summary>
        /// The timer
        /// </summary>
        private System.Windows.Forms.Timer timer = new System.Windows.Forms.Timer();
        #endregion         #region Form1
        public Form1()
        {
            InitializeComponent();
        }
        #endregion         #region Form1_Load
        private void Form1_Load(object sender, EventArgs e)
        {
            serialPort1 = new SerialPort("COM1");
            serialPort1.DataReceived += new SerialDataReceivedEventHandler(serialPort_DataReceived1);
            serialPort1.Open();
            serialPort2 = new SerialPort("COM2");
            serialPort2.DataReceived += new SerialDataReceivedEventHandler(serialPort_DataReceived2);
            serialPort2.Open();
        }
        #endregion         #region Form1_FormClosed
        private void Form1_FormClosed(object sender, FormClosedEventArgs e)
        {
            serialPort1.Close();
            serialPort1.Dispose();
            serialPort2.Close();
            serialPort2.Dispose();
        }
        #endregion         #region btnStart_Click
        private void btnStart_Click(object sender, EventArgs e)
        {
            start = true;
            SendData();             timer.Interval = 500;
            timer.Tick += new EventHandler(delegate(object obj, EventArgs eventArgs)
            {
                if (lastCount == 0)
                {
                    lastCount = successCount + errorCount;
                }
                else
                {
                    int cnt = successCount + errorCount - lastCount;
                    cnt = Data.Length * cnt / 1024 * (1000 / timer.Interval);
                    double total = (successCount + errorCount) * Data.Length / 1024.0;                     InvokeDelegate invokeDelegate = delegate()
                    {
                        label3.Text = cnt.ToString() + "KB/S " + total.ToString("#.0") + "KB";
                    };
                    InvokeUtil.Invoke(this, invokeDelegate);
                    lastCount = successCount + errorCount;
                }
            });
            timer.Start();
        }
        #endregion         #region btnStop_Click
        private void btnStop_Click(object sender, EventArgs e)
        {
            start = false;
            timer.Stop();
            timer.Dispose();
            timer = new System.Windows.Forms.Timer();
        }
        #endregion         #region Receive serial port data events
        /// <summary>
        /// Receive serial port data events
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        public void serialPort_DataReceived1(object sender, SerialDataReceivedEventArgs e)
        {
            if (serialPort1.ReadLine() != null)
            {
                successCount++;
                SendData();
            }
        }         /// <summary>
        /// Receive serial port data events
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        public void serialPort_DataReceived2(object sender, SerialDataReceivedEventArgs e)
        {
            List<byte> bList = new List<byte>();
            int i = 0;
            while (serialPort2.BytesToRead > 0)
            {
                byte[] bArr = new byte[serialPort2.BytesToRead];
                i += serialPort2.Read(bArr, 0, bArr.Length);
                bList.AddRange(bArr);
            }
            serialPort2.WriteLine("success");             string s = ASCIIEncoding.UTF8.GetString(bList.ToArray());
            InvokeDelegate invokeDelegate = delegate()
            {
                textBox2.Text = s;
            };
            InvokeUtil.Invoke(this, invokeDelegate);             if (s != Str)
            {
                errorCount++;
                invokeDelegate = delegate()
                {
                    label2.Text = errorCount + " Time is not equal ( failure )";
                };
                InvokeUtil.Invoke(this, invokeDelegate);
            }
            else
            {
                invokeDelegate = delegate()
                {
                    label1.Text = successCount + " Time is equal to ( successful )";
                };
                InvokeUtil.Invoke(this, invokeDelegate);
            }
        }
        #endregion         #region To send data
        private void SendData()
        {
            if (start)
            {
                Thread thread = new Thread(new ParameterizedThreadStart(delegate(object obj)
                {
                    InvokeDelegate invokeDelegate = delegate()
                    {
                        textBox1.Text = Str;
                    };
                    InvokeUtil.Invoke(this, invokeDelegate);                     serialPort1.Write(Data, 0, Data.Length);
                }));
                thread.Start();
            }
        }
        #endregion         #region data
        private static byte[] data = null;
        /// <summary>
        /// data
        /// </summary>
        private static byte[] Data
        {
            get
            {
                if (data == null)
                {
                    data = ASCIIEncoding.UTF8.GetBytes(Str);
                }                 return data;
            }
        }
        #endregion         #region Get string
        private static string str = null;
        /// <summary>
        /// string
        /// </summary>
        private static string Str
        {
            get
            {
                if (str == null)
                {
                    StringBuilder sb = new StringBuilder();
                    for (int i = 0; i < 270; i++)
                    {
                        sb.Append(" Computer program ");
                    }
                    str = sb.ToString();
                }                 return str;
            }
        }
        #endregion     }
}

The auxiliary codes are as follows:

using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms; namespace Utils
{
    /// <summary>
    /// Access the control's delegate across threads
    /// </summary>
    public delegate void InvokeDelegate();     /// <summary>
    /// Access control classes across threads
    /// </summary>
    public class InvokeUtil
    {
        /// <summary>
        /// Controls are accessed across threads
        /// </summary>
        /// <param name="ctrl">Form object </param>
        /// <param name="de"> entrust </param>
        public static void Invoke(Control ctrl, Delegate de)
        {
            if (ctrl.IsHandleCreated)
            {
                ctrl.BeginInvoke(de);
            }
        }
    }
}

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Win32;
using System.Security.Permissions;
using System.IO.Ports;
using System.Security; namespace Utils
{
    /// <summary>
    /// Serial port resource tool class
    /// </summary>
    public class SerialPortUtil
    {
        #region Gets a list of native serial ports, including virtual serial ports
        /// <summary>
        /// Gets a list of native serial ports, including virtual serial ports
        /// </summary>
        public static string[] GetCOMList()
        {
            List<string> list = new List<string>();             foreach (string portName in SerialPort.GetPortNames())
            {
                list.Add(portName);
            }             return list.ToArray();
        }
        #endregion         #region Gets the list of native serial ports from the registry
        /// <summary>
        /// Gets the list of native serial ports from the registry
        /// </summary>
        public static string[] GetPortNames()
        {
            RegistryKey localMachine = null;
            RegistryKey key2 = null;
            string[] textArray = null;             // There is an assertion that determines whether the registry key exists
            new RegistryPermission(RegistryPermissionAccess.Read, @"HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\SERIALCOMM").Assert();             try
            {
                localMachine = Registry.LocalMachine;
                key2 = localMachine.OpenSubKey(@"HARDWARE\DEVICEMAP\SERIALCOMM", false);
                if (key2 != null)
                {
                    string[] valueNames = key2.GetValueNames();
                    textArray = new string[valueNames.Length];
                    for (int i = 0; i < valueNames.Length; i++)
                    {
                        textArray[i] = (string)key2.GetValue(valueNames[i]);
                    }
                }
            }
            finally
            {
                if (localMachine != null)
                {
                    localMachine.Close();
                }
                if (key2 != null)
                {
                    key2.Close();
                }
                CodeAccessPermission.RevertAssert();
            }
            if (textArray == null)
            {
                textArray = new string[0];
            }
            return textArray;
        }
        #endregion     }
}

Hopefully this article has helped you with your C# programming.


Related articles: