1.用C#编写一个控制台程序,列出计算机上可用的串口,并能够选择要用的串口,波特率配置成9600,8,N,1,能够进行接受和发送字符串。
2.添加依赖项
3.程序
using System;
using System.IO.Ports;
using System.Text;
using System.Threading;
namespace SerialPortTerminal
{
class Program
{
private static SerialPort _serialPort;
private static bool _continue = true;
static void Main(string[] args)
{
Console.Title = "串口通信终端";
Console.OutputEncoding = Encoding.UTF8;
Console.InputEncoding = Encoding.UTF8;
try
{
// 列出可用串口
Console.WriteLine("可用的串口列表:");
string[] ports = SerialPort.GetPortNames();
if (ports.Length == 0)
{
Console.WriteLine("未找到可用串口。按任意键退出...");
Console.ReadKey();
return;
}
for (int i = 0; i < ports.Length; i++)
{
Console.WriteLine($"{i + 1}. {ports[i]}");
}
// 选择串口
int selectedIndex = -1;
while (selectedIndex < 0 || selectedIndex >= ports.Length)
{
Console.Write($"\n请选择串口 (1-{ports.Length}): ");
if (int.TryParse(Console.ReadLine(), out int input) && input > 0 && input <= ports.Length)
{
selectedIndex = input - 1;
}
else
{
Console.WriteLine("无效的选择,请重新输入。");
}
}
string selectedPort = ports[selectedIndex];
Console.WriteLine($"已选择: {selectedPort}");
// 创建并配置串口
_serialPort = new SerialPort(selectedPort)
{
BaudRate = 9600,
Parity = Parity.None,
DataBits = 8,
StopBits = StopBits.One,
Handshake = Handshake.None,
ReadTimeout = 500,
WriteTimeout = 500,
Encoding = Encoding.UTF8
};
// 设置数据接收事件处理
_serialPort.DataReceived += SerialPortDataReceived;
// 打开串口
_serialPort.Open();
Console.WriteLine("串口已打开,配置: 9600,8,N,1");
Console.WriteLine("输入要发送的文本 (输入 'exit' 退出):");
Console.WriteLine("---------------------------------");
// 启动发送线程
Thread writeThread = new Thread(Write);
writeThread.IsBackground = true;
writeThread.Start();
// 等待退出
while (_continue)
{
Thread.Sleep(100);
}
// 关闭串口
if (_serialPort.IsOpen)
{
_serialPort.Close();
}
Console.WriteLine("串口已关闭。");
}
catch (Exception ex)
{
Console.WriteLine($"错误: {ex.Message}");
Console.WriteLine("按任意键退出...");
Console.ReadKey();
}
}
private static void SerialPortDataReceived(object sender, SerialDataReceivedEventArgs e)
{
try
{
SerialPort sp = (SerialPort)sender;
string data = sp.ReadExisting();
if (!string.IsNullOrEmpty(data))
{
Console.Write($"[接收] {data}");
}
}
catch (Exception ex)
{
Console.WriteLine($"接收错误: {ex.Message}");
}
}
private static void Write()
{
while (_continue)
{
try
{
string message = Console.ReadLine();
if (message?.ToLower() == "exit")
{
_continue = false;
return;
}
if (_serialPort != null && _serialPort.IsOpen)
{
_serialPort.WriteLine(message);
Console.WriteLine($"[发送] {message}");
}
}
catch (Exception ex)
{
Console.WriteLine($"发送错误: {ex.Message}");
}
}
}
}
}
4.结果