python
复制代码
using System;
using System.IO.Ports;
using System.Threading;
using System.Windows.Forms;
public class SerialPortForm : Form
{
private ComboBox cboPorts;
private Button btnConnect;
private Button btnSend;
private TextBox txtMessage;
private RichTextBox rtbReceiver;
private SerialPort serialPort;
private System.Threading.Timer uiUpdateTimer;
public SerialPortForm()
{
this.Text = "串口通讯窗体";
this.Size = new System.Drawing.Size(400, 300);
cboPorts = new ComboBox();
cboPorts.Location = new System.Drawing.Point(20, 20);
cboPorts.DropDownStyle = ComboBoxStyle.DropDownList;
btnConnect = new Button();
btnConnect.Text = "连接";
btnConnect.Location = new System.Drawing.Point(150, 20);
btnConnect.Click += BtnConnect_Click;
txtMessage = new TextBox();
txtMessage.Location = new System.Drawing.Point(20, 60);
txtMessage.Width = 250;
btnSend = new Button();
btnSend.Text = "发送";
btnSend.Location = new System.Drawing.Point(280, 60);
btnSend.Click += BtnSend_Click;
rtbReceiver = new RichTextBox();
rtbReceiver.Location = new System.Drawing.Point(20, 100);
rtbReceiver.Width = 350;
rtbReceiver.Height = 150;
this.Controls.Add(cboPorts);
this.Controls.Add(btnConnect);
this.Controls.Add(txtMessage);
this.Controls.Add(btnSend);
this.Controls.Add(rtbReceiver);
LoadAvailablePorts();
}
private void LoadAvailablePorts()
{
string[] ports = SerialPort.GetPortNames();
cboPorts.Items.AddRange(ports);
if (ports.Length > 0)
cboPorts.SelectedIndex = 0;
}
private void BtnConnect_Click(object sender, EventArgs e)
{
if (serialPort == null)
{
serialPort = new SerialPort(cboPorts.SelectedItem.ToString(), 9600);
serialPort.DataReceived += SerialPort_DataReceived;
try
{
serialPort.Open();
MessageBox.Show("连接成功!");
uiUpdateTimer = new System.Threading.Timer(UpdateUI, null, 0, 20); // 每20ms更新UI
}
catch (Exception ex)
{
MessageBox.Show("连接失败: " + ex.Message);
}
}
else
{
MessageBox.Show("已经连接到串口!");
}
}
private void BtnSend_Click(object sender, EventArgs e)
{
if (serialPort != null && serialPort.IsOpen)
{
serialPort.WriteLine(txtMessage.Text);
}
else
{
MessageBox.Show("请先连接串口!");
}
}
private void SerialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
// 收到数据后不直接更新UI,先存储数据
}
private void UpdateUI(object state)
{
if (serialPort != null && serialPort.IsOpen)
{
string data = serialPort.ReadExisting();
if (!string.IsNullOrEmpty(data))
{
rtbReceiver.Invoke(new Action(() => rtbReceiver.AppendText(data + Environment.NewLine)));
}
}
}
protected override void OnFormClosing(FormClosingEventArgs e)
{
uiUpdateTimer?.Change(Timeout.Infinite, Timeout.Infinite); // 停止定时器
uiUpdateTimer?.Dispose();
if (serialPort != null && serialPort.IsOpen)
{
serialPort.Close();
}
base.OnFormClosing(e);
}
[STAThread]
public static void Main()
{
Application.EnableVisualStyles();
Application.Run(new SerialPortForm());
}
}