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}"); } } } } }