private void but_sendData_Click(object sender, EventArgs e) { try { if (string.IsNullOrWhiteSpace(txt_dataPackage.Text)) { MessageBox.Show("请输入要发送的报文"); return; } var dataPackageString = txt_dataPackage.Text.Replace(" ", ""); if (dataPackageString.Length % 2 != 0) { MessageBox.Show("请输入正确的的报文"); return; } var dataPackage = DataConvert.StringToByteArray(txt_dataPackage.Text?.Trim(), false); var msg = client.SendPackage(dataPackage); AppendText($"[请求报文]{string.Join(" ", dataPackage.Select(t => t.ToString("X2")))}\r"); AppendText($"[响应报文]{string.Join(" ", msg.Select(t => t.ToString("X2")))}\r\n"); } catch (Exception ex) { MessageBox.Show(ex.Message); client.Close(); client.Open(); } }
/// <summary> /// 自动扫描可连接串口属性 /// </summary> /// <returns></returns> private void AutoOpenRead() { #region 当前选择的配置有效匹配 FirstItem(ref BaudRateList, int.Parse(cb_baudRate.Text.ToString())); FirstItem(ref DataBitList, int.Parse(txt_dataBit.Text.ToString())); FirstItem(ref StopBitsList, (StopBits)int.Parse(txt_stopBit.Text.ToString())); var firstParity = cb_parity.SelectedIndex == 0 ? Parity.None : (cb_parity.SelectedIndex == 1 ? Parity.Odd : Parity.Even); FirstItem(ref ParityList, firstParity); #endregion byte.TryParse(txt_stationNumber.Text?.Trim(), out byte stationNumber); if (!client.ReadInt16("0", stationNumber).IsSucceed) { foreach (var baudRate in BaudRateList) { foreach (var dataBit in DataBitList) { foreach (var stopBits in StopBitsList) { foreach (var parity in ParityList) { for (byte i = 0; i < 255; i++) { stationNumber = (byte)(i + 1); if (but_open.Enabled) { return; } client?.Close(); client = new ModbusRtuClient(cb_portNameSend.Text.ToString(), baudRate, dataBit, stopBits, parity); var result = client.Open(); if (result.IsSucceed) { if (client.ReadInt16("0", stationNumber).IsSucceed) { AppendText($@"连接【成功】 端口:{cb_portNameSend.Text.ToString()} 波特率:{baudRate} 数据位:{dataBit} 停止位:{stopBits} 奇偶:{parity} 站号:{stationNumber}"); return; } else { AppendText($@"连接失败 端口:{cb_portNameSend.Text.ToString()} 波特率:{baudRate} 数据位:{dataBit} 停止位:{stopBits} 奇偶:{parity} 站号:{stationNumber}"); } } else { AppendText($"连接异常 端口:{cb_portNameSend.Text.ToString()} 波特率:{baudRate} 数据位:{dataBit} 停止位:{stopBits} 奇偶:{parity} 站号:{stationNumber} Err:{result.Err}"); } } } } } } } else { AppendText($@"连接【成功】 端口:{cb_portNameSend.Text} 波特率:{cb_baudRate.Text} 数据位:{txt_dataBit.Text} 停止位:{txt_stopBit.Text} 奇偶:{cb_parity.Text} 站号:{stationNumber}"); } }
/// <summary> /// 打开连接 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void but_open_Click(object sender, EventArgs e) { try { if (txt_content.Text.Contains("小技巧")) { txt_content.Text = string.Empty; } var PortName = cb_portNameSend.Text.ToString(); var BaudRate = int.Parse(cb_baudRate.Text.ToString()); var DataBits = int.Parse(txt_dataBit.Text.ToString()); var StopBits = (StopBits)int.Parse(txt_stopBit.Text.ToString()); var parity = cb_parity.SelectedIndex == 0 ? Parity.None : (cb_parity.SelectedIndex == 1 ? Parity.Odd : Parity.Even); client?.Close(); client = new ModbusRtuClient(PortName, BaudRate, DataBits, StopBits, parity); var result = client.Open(); if (result.IsSucceed) { but_open.Enabled = false; cb_portNameSend.Enabled = false; but_read.Enabled = true; but_write.Enabled = true; but_open.Enabled = false; but_close.Enabled = true; but_sendData.Enabled = true; //按了Ctrl后的鼠标点击 if ((ModifierKeys & Keys.Control) == Keys.Control) { Task.Run(() => { AutoOpenRead(); }); } else { AppendText("连接成功"); } } else { AppendText($"连接失败:{result.Err}"); } } catch (Exception ex) { MessageBox.Show(ex.Message); } }
static bool OpenPort(ModbusRtuClient client) { try { client.Open(); } catch (Exception exp) when( exp is UnauthorizedAccessException || exp is InvalidOperationException || exp is IOException) { Console.Error.WriteLine("Unable to open port."); return(false); } return(true); }
public async Task 长连接主动开关() { client.Open(); short Number = 33; client.Write("4", Number, stationNumber); Assert.True(client.ReadInt16("4", stationNumber).Value == Number); Number = 34; client.Write("4", Number, stationNumber); Assert.True(client.ReadInt16("4", stationNumber).Value == Number); Number = 1; client.Write("12", Number, stationNumber); Assert.True(client.ReadInt16("12", stationNumber).Value == 1); Number = 0; client.Write("12", Number, stationNumber); Assert.True(client.ReadInt16("12", stationNumber).Value == 0); int numberInt32 = -12; client.Write("4", numberInt32, stationNumber); Assert.True(client.ReadInt32("4", stationNumber).Value == numberInt32); float numberFloat = 112; client.Write("4", numberFloat, stationNumber); Assert.True(client.ReadFloat("4", stationNumber).Value == numberFloat); double numberDouble = 32; client.Write("4", numberDouble, stationNumber); Assert.True(client.ReadDouble("4", stationNumber).Value == numberDouble); client.Close(); }
static int RunDetectPorts(DetectPortsOptions opts) { var validPorts = new List <PortDescription>(); using (var client = new ModbusRtuClient()) { client.BaudRate = opts.BaudRate; client.DataBits = opts.DataBits; client.Parity = opts.Parity; foreach (var portDesc in SerialPortStream.GetPortDescriptions()) { client.PortName = portDesc.Port; if (opts.Verbose) { Console.Error.Write($"Trying {portDesc.Port}"); if (!string.IsNullOrEmpty(portDesc.Description)) { Console.Out.Write($" ({portDesc.Description})"); } Console.Out.Write("..."); } try { client.Open(); } catch (Exception exp) when(exp is UnauthorizedAccessException || exp is InvalidOperationException) { if (opts.Verbose) { Console.Error.WriteLine("already in use."); } continue; } catch (IOException) { if (opts.Verbose) { Console.Error.WriteLine("cannot open."); } continue; } try { client.ReadHoldingRegisters(opts.UnitAddress, 0, 1); } catch (TimeoutException) { if (opts.Verbose) { Console.Error.WriteLine("timeout."); } client.Close(); continue; } catch (FormatException) { if (opts.Verbose) { Console.Error.WriteLine("frame error."); } client.Close(); continue; } catch (ModbusException) { } if (opts.Verbose) { Console.Error.WriteLine("valid."); } validPorts.Add(portDesc); client.Close(); } } if (opts.Verbose) { Console.Error.WriteLine(); } foreach (var portDesc in validPorts) { Console.Out.Write($"{portDesc.Port}"); if (!string.IsNullOrEmpty(portDesc.Description)) { Console.Out.Write($" ({portDesc.Description})"); } Console.Out.WriteLine(); } return(0); }