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 timeoutDtrEnable = true,RtsEnable = true,};// Clear buffers BEFORE openingif (serialPort.IsOpen){serialPort.DiscardInBuffer();serialPort.DiscardOutBuffer();}serialPort.Open();// Clear buffers AFTER opening serialPort.DiscardInBuffer();serialPort.DiscardOutBuffer();// Initial synchronous read to catch the first messagetry{// Try to read first message synchronously with timeoutstring firstMessage = serialPort.ReadLine();lock (lockObject){Console.WriteLine($"*** FIRST MESSAGE (SYNC) *** Received: {firstMessage}");isFirstMessage = false;}}catch (TimeoutException){// No data available yet, continue with asyncConsole.WriteLine("No initial data, waiting for async messages...");}// Now subscribe to async eventsserialPort.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 datastring receivedData = sp.ReadExisting();buffer.Append(receivedData);// Process complete linesstring 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 neededif (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}");}}}} }