OperateRs485.cs 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. using System.IO.Ports;
  2. namespace SHJX.Service.PortClient.OptionClient.RS485
  3. {
  4. public class OperateRs485
  5. {
  6. #region Field
  7. private readonly bool _isAuto;
  8. private readonly string _portName;
  9. #endregion
  10. #region Property
  11. public static string PortName => Rs485Client.Sport.PortName;
  12. public static bool PortState => Rs485Client.IsValid;
  13. #endregion
  14. public OperateRs485(string portName, bool autoPort)
  15. {
  16. _portName = portName;
  17. _isAuto = autoPort;
  18. }
  19. /// <summary>
  20. /// 打开连接
  21. /// </summary>
  22. /// <returns></returns>
  23. public (string, bool) OpenClient()
  24. {
  25. Rs485Client.InitPort();
  26. if (Rs485Client.IsValid)
  27. {
  28. return (Rs485Client.Sport.PortName, Rs485Client.IsValid);
  29. }
  30. if (_isAuto)
  31. {
  32. var portStr = FindMoonsMotor();
  33. if (string.IsNullOrWhiteSpace(portStr))
  34. {
  35. return ("NULL", false);
  36. }
  37. Rs485Client.Open(portStr);
  38. }
  39. else
  40. {
  41. Rs485Client.Open(_portName);
  42. }
  43. return (Rs485Client.Sport.PortName, Rs485Client.IsValid);
  44. }
  45. /// <summary>
  46. /// 遍历所有COM口,查找鸣志电机通信口.
  47. /// </summary>
  48. /// <param name="addr">电机RS485地址号</param>
  49. /// <returns>找到的端口名,否则为string.Empty</returns>
  50. private string FindMoonsMotor(char addr = '1')
  51. {
  52. string portName = string.Empty; // 记录找到的端口
  53. foreach (string comport in SerialPort.GetPortNames())
  54. {
  55. Rs485Client.Open(comport);
  56. if (!Rs485Client.IsValid)
  57. {
  58. continue;
  59. }
  60. var strCmd = $"{addr}SC\r";
  61. var strRes = Rs485Client.SendData(strCmd, "\r");
  62. Rs485Client.Close();
  63. if (string.IsNullOrWhiteSpace(strRes) || !strRes.Contains("SC="))
  64. {
  65. continue;
  66. }
  67. portName = comport;// OK,找到端口
  68. break;
  69. }
  70. return portName;
  71. }
  72. }
  73. }