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]()