C# SerialPort send and receive full example

Install-Package System.IO.Ports;

 

//Sender.cs
using System.IO.Ports;
using System.Text;

namespace ConsoleApp35
{
    internal class Program
    {
        static async Task Main(string[] args)
        {
            await SerialPortSendAsync();
            Console.WriteLine("Sending Finished!");
        }

        static async Task SerialPortSendAsync()
        {
            using (SerialPort serialPort = new SerialPort("COM8", 115200, Parity.None, 8, StopBits.One))
            {
                serialPort.Handshake = Handshake.None;
                serialPort.Encoding = Encoding.UTF8;
                serialPort.NewLine="\r\n";
                try
                {
                    serialPort.Open();
                    serialPort.DiscardInBuffer();
                    serialPort.DiscardOutBuffer();
                    // 等 200 ms 让接收端订阅事件并稳定,然后开始发
                    await Task.Delay(200); 
                    string msg = "";
                    for (int idx = 1; idx < 100001; idx++)
                    {
                        msg = $"[{idx}]_{Guid.NewGuid():N}";
                        serialPort.WriteLine(msg);
                        Console.WriteLine($"Send:{msg}");
                        await Task.Delay(500);
                    }
                }
                catch (Exception ex)
                {
                     Console.WriteLine(ex.Message);
                }
                finally
                {
                    serialPort.Close();
                }
            }
        }
    }
}

//Receiver.cs
using System.IO.Ports;
using System.Text;

namespace ConsoleApp36
{
    internal class Program
    {
        static SerialPort serialPort;
        private static readonly object lockObject = new object();
        static StringBuilder buffer = new StringBuilder();
        static bool isFirstMessage = true;

        static void Main(string[] args)
        {
            try
            {
                Console.WriteLine("Starting serial port receiver...");
                SerialPortReceive();
                Console.WriteLine("Press Enter to exit...");
                Console.ReadLine();
                Console.WriteLine("SerialPort receiving finished!");
            }
            catch (Exception ex)
            {
                Console.WriteLine($"Error: {ex.Message}");
            }
            finally
            {
                serialPort?.Close();
                serialPort?.Dispose();
            }
        }

        static void SerialPortReceive()
        {
            serialPort = new SerialPort("COM9", 115200, Parity.None, 8, StopBits.One)
            {
                Handshake = Handshake.None,
                Encoding = Encoding.UTF8,
                NewLine = "\r\n",
                ReadTimeout = 1000, // Increased timeout
                DtrEnable = true,
                RtsEnable = true,
            };

            // Clear buffers BEFORE opening
            if (serialPort.IsOpen)
            {
                serialPort.DiscardInBuffer();
                serialPort.DiscardOutBuffer();
            }

            serialPort.Open();

            // Clear buffers AFTER opening
            serialPort.DiscardInBuffer();
            serialPort.DiscardOutBuffer();

            // Initial synchronous read to catch the first message
            try
            {
                // Try to read first message synchronously with timeout
                string firstMessage = serialPort.ReadLine();
                lock (lockObject)
                {
                    Console.WriteLine($"*** FIRST MESSAGE (SYNC) *** Received: {firstMessage}");
                    isFirstMessage = false;
                }
            }
            catch (TimeoutException)
            {
                // No data available yet, continue with async
                Console.WriteLine("No initial data, waiting for async messages...");
            }

            // Now subscribe to async events
            serialPort.DataReceived += SerialPort_DataReceived;

            Console.WriteLine("Receiver initialized and ready on COM9");
        }

        private static void SerialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            try
            {
                var sp = (SerialPort)sender;
                if (sp==null)
                {
                    return;
                }

                // Read all available data
                string receivedData = sp.ReadExisting();
                buffer.Append(receivedData);

                // Process complete lines
                string bufferContent = buffer.ToString();
                int newLineIndex;
                while ((newLineIndex = bufferContent.IndexOf("\r\n")) >= 0)
                {
                    string completeMessage = bufferContent.Substring(0, newLineIndex);
                    bufferContent = bufferContent.Substring(newLineIndex + 2);

                    // Handle first message specially if needed
                    if (isFirstMessage)
                    {
                        lock (lockObject)
                        {
                            Console.WriteLine($"*** FIRST MESSAGE *** Received: {completeMessage}");
                            isFirstMessage = false;
                        }
                    }
                    else
                    {
                        lock (lockObject)
                        {
                            Console.WriteLine($"Received: {completeMessage}");
                        }
                    }
                }

                buffer = new StringBuilder(bufferContent);
            }
            catch (Exception ex)
            {
                lock (lockObject)
                {
                    Console.WriteLine($"Error in DataReceived: {ex.Message}");
                }
            }
        }
    }
}

 

 

 

 

image

 

 

 

image

 

posted @ 2025-10-16 13:24  FredGrit  阅读(3)  评论(0)    收藏  举报