CNAS取数仪器端升级
Du kan inte välja fler än 25 ämnen Ämnen måste starta med en bokstav eller siffra, kan innehålla bindestreck ('-') och vara max 35 tecken långa.

164 lines
4.8KB

  1. using System;
  2. using System.Collections.Generic;
  3. using System.IO.Ports;
  4. using System.Linq;
  5. using System.Text;
  6. using System.Threading.Tasks;
  7. namespace CNAS_SerialPort
  8. {
  9. public class SerialPortHelper
  10. {
  11. /// <summary>
  12. /// 串口助手通用类
  13. /// </summary>
  14. #region 相关属性
  15. /// <summary>
  16. /// 创建一个串口操作对象
  17. /// </summary>
  18. private SerialPort serialPort = null;
  19. public SerialPort SerialPortObject
  20. {
  21. get { return serialPort; }
  22. }
  23. /// <summary>
  24. /// 获取当前计算机上可用的端口列表【只读】
  25. /// </summary>
  26. public string[] PortNames
  27. {
  28. get { return System.IO.Ports.SerialPort.GetPortNames(); }
  29. }
  30. /// <summary>
  31. /// 进制转换对象属性
  32. /// </summary>
  33. private AlgorithmHelper algorithmHelper = null;
  34. public AlgorithmHelper AlgorithmHelperObject
  35. {
  36. get { return algorithmHelper; }
  37. }
  38. /// <summary>
  39. /// 构造方法中初始化相关数据
  40. /// </summary>
  41. public SerialPortHelper()
  42. {
  43. this.serialPort = new SerialPort();
  44. this.algorithmHelper = new AlgorithmHelper();
  45. //串口基本参数初始化
  46. this.serialPort.BaudRate = 9600;
  47. this.serialPort.Parity = System.IO.Ports.Parity.None;//校验位默认NONE
  48. this.serialPort.DataBits = 8;//数据位默认8位
  49. this.serialPort.StopBits = System.IO.Ports.StopBits.One;//停止位默认1位
  50. }
  51. #endregion
  52. #region 打开或关闭端口
  53. /// <summary>
  54. /// 根据端口名称打开端口或关闭端口
  55. /// </summary>
  56. /// <param name="portName">端口名称</param>
  57. /// <param name="status">操作状态:1表示打开,0表示关闭</param>
  58. /// <returns>返回当前端口的打开状态true或false</returns>
  59. public bool OpenSerialPort(string portName, int status)
  60. {
  61. if (status == 1)
  62. {
  63. this.serialPort.PortName = portName;//只有在端口没有打开的时候,才能设置名称。
  64. this.serialPort.Open();
  65. }
  66. else
  67. {
  68. this.serialPort.Close();
  69. }
  70. return this.serialPort.IsOpen;//返回串口打开的状态
  71. }
  72. #endregion
  73. #region 发送数据
  74. /// <summary>
  75. /// 判断十六进制字符串hex是否正确
  76. /// </summary>
  77. /// <param name="hex">十六进制字符串</param>
  78. /// <returns>true:正确,false:不正确<returns>
  79. private bool IsIIlegalHex(string hex)
  80. {
  81. return System.Text.RegularExpressions.Regex.IsMatch(hex, @"([^A-Fa-f0-9]|\s+?)+");
  82. }
  83. /// <summary>
  84. /// 发送数据(可以是16进制,也可以是字符串)
  85. /// </summary>
  86. /// <param name="data">要发送的数据</param>
  87. /// <param name="format">发送的数据格式</param>
  88. public void SendData(string data, SendFormat format)
  89. {
  90. if (!this.serialPort.IsOpen)
  91. {
  92. throw new Exception("端口未打开!请打开相关端口!");//让调用者处理
  93. }
  94. else
  95. {
  96. byte[] byteData;
  97. if (format == SendFormat.Hex)//如果是16进制
  98. {
  99. if (this.IsIIlegalHex(data))
  100. {
  101. byteData = algorithmHelper.From16ToBtyes(data);//将16进制转换成byte[]数组
  102. }
  103. else
  104. {
  105. throw new Exception("数据不是16进制格式!");
  106. }
  107. }
  108. else //发送字符串
  109. {
  110. byteData = algorithmHelper.StringToBytes(data, false);
  111. }
  112. this.serialPort.Write(byteData, 0, byteData.Length);//发送数据(数据,从0开始,结束位置)
  113. }
  114. }
  115. #endregion
  116. #region 接收数据
  117. /// <summary>
  118. /// 串口接收数据
  119. /// </summary>
  120. /// <returns></returns>
  121. public byte[] ReceiveData()
  122. {
  123. //定义一个接收数组,获取接收缓冲区数据的字节数
  124. byte[] byteData = new byte[this.serialPort.BytesToRead];
  125. //读取数据
  126. this.serialPort.Read(byteData, 0, serialPort.BytesToRead);
  127. return byteData;
  128. }
  129. #endregion
  130. }
  131. #region 发送格式选择枚举
  132. /// <summary>
  133. /// 发送格式选择
  134. /// </summary>
  135. public enum SendFormat
  136. {
  137. Hex,//十六进制
  138. String
  139. }
  140. #endregion
  141. }