ソースを参照

设置波特率问题解决(用新的波特率打开串口,造成无法通信)

djs 4 ヶ月 前
コミット
f2c5b755c4
3 ファイル変更77 行追加20 行削除
  1. 14 4
      MV485/helper/RWBasicConfig.cs
  2. 60 11
      MV485/helper/SerialHelper.cs
  3. 3 5
      MV485/uc/UCDeviceConfig.xaml.cs

+ 14 - 4
MV485/helper/RWBasicConfig.cs

@@ -62,10 +62,11 @@ namespace MV485.helper
             //设置波特率
             try
             {
-                if (OpenSerial(_portName, writeConfig.BaudRate))
+                if (OpenSerial(_portName, _readBaudrate))
+               //if(OpenSerial("COM1",14400))
                 {
                     bool blSetBaudRate = true;
-                    //if (readConfig.BaudRate != writeConfig.BaudRate)
+                    if (readConfig.BaudRate != writeConfig.BaudRate)
                     {
                         blSetBaudRate = SetBaudRate(readConfig.DeviceAddress, writeConfig.BaudRate);
                     }
@@ -154,7 +155,11 @@ namespace MV485.helper
             }
             catch (Exception ex)
             {
-                _message = $"获取设备类型出错,{ex.Message}";
+                sentData = _modbusTransport.GetLastSentData();
+                string sendDataHex = BitConverter.ToString(sentData).Replace("-", " ");
+                string srMsg = $"发送: {sendDataHex}";
+
+                _message = $"获取设备类型出错,{srMsg},{ex.Message}";
                 RWLog?.Invoke(_message);
             }
 
@@ -428,6 +433,8 @@ namespace MV485.helper
                 // 发送 Modbus 命令修改地址
                 _modbusMaster.WriteSingleRegister(devId, 0xF2, newBaudrateType);
                 //await _modbusMaster.WriteSingleRegisterAsync(devId, 0xF2, newBaudrateType);
+                //_modbusMaster.WriteSingleRegister(devId, 0xF0, newDeviceAddress);
+
 
                 sentData = _modbusTransport.GetLastSentData();
                 recvData = _modbusTransport.GetLastReceivedData();
@@ -469,7 +476,7 @@ namespace MV485.helper
                 _modbusMaster.WriteSingleRegister(devId, 0xF0, newDeviceAddress);
 
                 sentData = _modbusTransport.GetLastSentData();
-                recvData = _modbusTransport.GetLastReceivedData();
+                recvData =  _modbusTransport.GetLastReceivedData();
                 string sendDataHex = BitConverter.ToString(sentData).Replace("-", " ");
                 string recvDataHex = BitConverter.ToString(recvData).Replace("-", " ");
                 string srMsg = $"发送: {sendDataHex},接收: {recvDataHex}";
@@ -513,6 +520,9 @@ namespace MV485.helper
                 _serialPort = serialPort;
                 _modbusMaster = ModbusSerialMaster.CreateRtu(_serialPort);
                 _modbusTransport = (ModbusSerialTransport)_modbusMaster.Transport;
+                //_modbusTransport.Retries = 1;
+                //_modbusTransport.WaitToRetryMilliseconds = 1000;
+                //_modbusTransport.RetryOnOldResponseThreshold = 500;
 
                 _message = $"串口{portName}连接成功";
                 RWLog?.Invoke(_message);

+ 60 - 11
MV485/helper/SerialHelper.cs

@@ -18,7 +18,6 @@ namespace MV485.helper
             "115200", "57600","56000", "38400", "19200","14400", "9600", "4800", "2400", "1200", "600", "300", "110"
         };
 
-
         public static List<SPortModel> GetSerialPortsWithDetails()
         {
             List<SPortModel> ports = new List<SPortModel>();
@@ -27,12 +26,12 @@ namespace MV485.helper
             {
                 foreach (ManagementObject obj in searcher.Get())
                 {
-                    string name = obj["Name"]?.ToString() ?? "未知设备"; // 设备名称
-                    string cleanName = Regex.Replace(name, @"\(\w+\)", "").Trim();
-                    string port = ExtractCOMPort(name); // 提取 COM 端口号
+                    string name = obj["Name"]?.ToString() ?? "未知设备"; // 获取完整设备名称
 
+                    string port = ExtractCOMPort(name); // 提取 COM 端口号
                     if (!string.IsNullOrEmpty(port))
                     {
+                        string cleanName = CleanDeviceName(name); // 清理设备名称
                         ports.Add(new SPortModel(port, cleanName));
                     }
                 }
@@ -40,20 +39,70 @@ namespace MV485.helper
             return ports;
         }
 
-        static string ExtractCOMPort(string deviceName)
+        private static string ExtractCOMPort(string name)
         {
-            int start = deviceName.IndexOf("(COM");
-            if (start >= 0)
+            // 处理标准格式: "USB Serial Port (COM6)"
+            Match match = Regex.Match(name, @"\(COM\d+");
+            if (match.Success)
             {
-                int end = deviceName.IndexOf(")", start);
-                if (end > start)
+                return match.Value.Trim('(', ')'); // 提取 COM 端口号
+            }
+
+            // 处理虚拟串口: "Electronic Team Virtual Serial Port (COM1->COM2)"
+            match = Regex.Match(name, @"\(COM\d+->COM\d+\)");
+            if (match.Success)
+            {
+                Match firstPortMatch = Regex.Match(match.Value, @"COM\d+");
+                if (firstPortMatch.Success)
                 {
-                    return deviceName.Substring(start + 1, end - start - 1); // 获取 "COMX"
+                    return firstPortMatch.Value; // 只返回第一个端口 COM1
                 }
             }
-            return null;
+
+            return string.Empty;
         }
 
+        private static string CleanDeviceName(string name)
+        {
+            // 移除所有带 COMx 的部分,包括 (COMx) 和 (COMx->COMy)
+            return Regex.Replace(name, @"\s*\(COM\d+.*?\)", "").Trim();
+        }
+
+        //public static List<SPortModel> GetSerialPortsWithDetails()
+        //{
+        //    List<SPortModel> ports = new List<SPortModel>();
+
+        //    using (var searcher = new ManagementObjectSearcher("SELECT * FROM Win32_PnPEntity WHERE Name LIKE '%(COM%'"))
+        //    {
+        //        foreach (ManagementObject obj in searcher.Get())
+        //        {
+        //            string name = obj["Name"]?.ToString() ?? "未知设备"; // 设备名称
+        //            string cleanName = Regex.Replace(name, @"\(\w+\)", "").Trim();
+        //            string port = ExtractCOMPort(name); // 提取 COM 端口号
+
+        //            if (!string.IsNullOrEmpty(port))
+        //            {
+        //                ports.Add(new SPortModel(port, cleanName));
+        //            }
+        //        }
+        //    }
+        //    return ports;
+        //}
+
+        //static string ExtractCOMPort(string deviceName)
+        //{
+        //    int start = deviceName.IndexOf("(COM");
+        //    if (start >= 0)
+        //    {
+        //        int end = deviceName.IndexOf(")", start);
+        //        if (end > start)
+        //        {
+        //            return deviceName.Substring(start + 1, end - start - 1); // 获取 "COMX"
+        //        }
+        //    }
+        //    return null;
+        //}
+
         //----直接获取串口名称
         public static string[] GetSerialPortNames()
         {

+ 3 - 5
MV485/uc/UCDeviceConfig.xaml.cs

@@ -263,9 +263,9 @@ namespace MV485.uc
             if(_readConfig.BaudRate == writeConfig.BaudRate && 
                 _readConfig.DeviceAddress == writeConfig.DeviceAddress)
             {
-                //MessageBox.Show(Application.Current.MainWindow, "设置值与读取值无变化,设置无效", "提示",
-                //    MessageBoxButton.OK, MessageBoxImage.Warning);
-                //return;
+                MessageBox.Show(Application.Current.MainWindow, "设置值与读取值无变化,设置无效", "提示",
+                    MessageBoxButton.OK, MessageBoxImage.Warning);
+                return;
             }
 
             //显示等待串口
@@ -330,8 +330,6 @@ namespace MV485.uc
             {
                 waitWindow.Close();
             }
-
-
         }
 
         private void btnClearLog_Click(object sender, RoutedEventArgs e)