diff --git a/WindowsFormsApp6/MainForm.cs b/WindowsFormsApp6/MainForm.cs
index a1ea59e..e3c4f62 100644
--- a/WindowsFormsApp6/MainForm.cs
+++ b/WindowsFormsApp6/MainForm.cs
@@ -59,42 +59,159 @@ namespace WindowsFormsApp6
_readTimer.Interval = 100; // 100ms检查一次信号量
_readTimer.Tick += ReadTimer_Tick;
- // 配置串口参数
- _serialPort = new SerialPort
+ // 尝试打开默认串口
+ if (!TryOpenSerialPort("COM2"))
{
- PortName = "COM2",
- BaudRate = 19200,
- DataBits = 8,
- Parity = Parity.None,
- StopBits = StopBits.One,
- ReadTimeout = 500,
- WriteTimeout = 500,
- RtsEnable = false,
- DtrEnable = false
- };
+ // 如果默认串口失败,弹出端口选择对话框
+ ShowPortSelectionDialog();
+ }
+ }
+ ///
+ /// 尝试打开指定的串口
+ ///
+ private bool TryOpenSerialPort(string portName)
+ {
try
{
- // 打开串口
- if (!_serialPort.IsOpen)
+ // 如果已有串口打开,先关闭
+ if (_serialPort != null && _serialPort.IsOpen)
{
- _serialPort.Open();
-
- // 创建Modbus RTU主站
- _modbusMaster = ModbusSerialMaster.CreateRtu(_serialPort);
- _modbusMaster.Transport.WaitToRetryMilliseconds = 200;
- _modbusMaster.Transport.Retries = 1;
- _modbusMaster.Transport.ReadTimeout = 500;
-
- // 启动定时读取
- _readTimer.Start();
-
- ShowInfoMsg("数据采集器初始化成功");
+ _serialPort.Close();
+ _serialPort.Dispose();
}
+
+ // 配置串口参数
+ _serialPort = new SerialPort
+ {
+ PortName = portName,
+ BaudRate = 19200,
+ DataBits = 8,
+ Parity = Parity.None,
+ StopBits = StopBits.One,
+ ReadTimeout = 500,
+ WriteTimeout = 500,
+ RtsEnable = false,
+ DtrEnable = false
+ };
+
+ // 打开串口
+ _serialPort.Open();
+
+ // 创建Modbus RTU主站
+ _modbusMaster = ModbusSerialMaster.CreateRtu(_serialPort);
+ _modbusMaster.Transport.WaitToRetryMilliseconds = 200;
+ _modbusMaster.Transport.Retries = 1;
+ _modbusMaster.Transport.ReadTimeout = 500;
+
+ // 启动定时读取
+ _readTimer.Start();
+
+ ShowInfoMsg($"串口 {portName} 初始化成功");
+ return true;
}
catch (Exception ex)
{
- ShowErrorMsg($"串口/Modbus初始化失败:{ex.Message}");
+ System.Diagnostics.Debug.WriteLine($"打开串口 {portName} 失败:{ex.Message}");
+ return false;
+ }
+ }
+
+ ///
+ /// 显示端口选择对话框
+ ///
+ private void ShowPortSelectionDialog()
+ {
+ // 获取当前计算机所有可用串口
+ string[] ports = SerialPort.GetPortNames();
+
+ if (ports == null || ports.Length == 0)
+ {
+ ShowErrorMsg("未检测到可用的串口,请检查串口连接。");
+ return;
+ }
+
+ // 创建端口选择对话框
+ Form portDialog = new Form
+ {
+ Text = "选择串口",
+ Width = 350,
+ Height = 200,
+ StartPosition = FormStartPosition.CenterParent,
+ FormBorderStyle = FormBorderStyle.FixedDialog,
+ MaximizeBox = false,
+ MinimizeBox = false
+ };
+
+ Label label = new Label
+ {
+ Text = "串口初始化失败,请选择可用的串口:",
+ Location = new Point(20, 20),
+ AutoSize = true
+ };
+
+ ComboBox comboBox = new ComboBox
+ {
+ Location = new Point(20, 50),
+ Width = 290,
+ DropDownStyle = ComboBoxStyle.DropDownList
+ };
+ comboBox.Items.AddRange(ports);
+ if (comboBox.Items.Count > 0)
+ {
+ comboBox.SelectedIndex = 0;
+ }
+
+ Button btnOK = new Button
+ {
+ Text = "确定",
+ DialogResult = DialogResult.OK,
+ Location = new Point(140, 100),
+ Width = 80
+ };
+
+ Button btnCancel = new Button
+ {
+ Text = "取消",
+ DialogResult = DialogResult.Cancel,
+ Location = new Point(230, 100),
+ Width = 80
+ };
+
+ portDialog.Controls.AddRange(new Control[] { label, comboBox, btnOK, btnCancel });
+ portDialog.AcceptButton = btnOK;
+ portDialog.CancelButton = btnCancel;
+
+ // 显示对话框
+ if (portDialog.ShowDialog(this) == DialogResult.OK)
+ {
+ string selectedPort = comboBox.SelectedItem?.ToString();
+ if (!string.IsNullOrEmpty(selectedPort))
+ {
+ if (TryOpenSerialPort(selectedPort))
+ {
+ // 成功打开
+ return;
+ }
+ else
+ {
+ // 选择的端口也失败,询问是否重新选择
+ var result = MessageBox.Show(
+ $"打开串口 {selectedPort} 失败,是否重新选择?",
+ "错误",
+ MessageBoxButtons.YesNo,
+ MessageBoxIcon.Error);
+
+ if (result == DialogResult.Yes)
+ {
+ ShowPortSelectionDialog(); // 递归调用,重新选择
+ }
+ }
+ }
+ }
+ else
+ {
+ ShowErrorMsg("未选择串口,数据采集功能将不可用。");
}
}