SerialCommunication.cs 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading;
  6. using System.IO.Ports;
  7. namespace StandardLibrary
  8. {
  9. interface IUART
  10. {
  11. /// <summary>
  12. /// 获取或设置串口的串口号
  13. /// </summary>
  14. string PortName { get; set; }
  15. /// <summary>
  16. /// 获取或设置波特率
  17. /// </summary>
  18. int BaudRate { get; set; }
  19. /// <summary>
  20. /// 获取或设置串口的校验位
  21. /// </summary>
  22. Parity Parity { get; set; }
  23. /// <summary>
  24. /// 获取或设置串口的数据位
  25. /// </summary>
  26. int DataBits { get; set; }
  27. /// <summary>
  28. /// 获取或设置串口的停止位
  29. /// </summary>
  30. StopBits StopBits { get; set; }
  31. /// <summary>
  32. /// 获取串口的打开状态
  33. /// </summary>
  34. bool OpenStatus { get; }
  35. /// <summary>
  36. /// 打开串口
  37. /// </summary>
  38. /// <returns>true 打开成功,false 打开失败</returns>
  39. bool Open();
  40. /// <summary>
  41. /// 关闭串口
  42. /// </summary>
  43. /// <returns>true 关闭成功,false 关闭异常</returns>
  44. bool Close();
  45. /// <summary>
  46. /// 发送数据
  47. /// </summary>
  48. /// <param name="message">字符串数据</param>
  49. /// <returns>true 发送成功,false 发送失败</returns>
  50. bool Send(string message);
  51. /// <summary>
  52. /// 发送数据
  53. /// </summary>
  54. /// <param name="message">字节数组数据</param>
  55. /// <returns>true 发送成功,false 发送失败</returns>
  56. bool Send(byte[] message);
  57. /// <summary>
  58. /// 接收数据解码
  59. /// </summary>
  60. /// <param name="data">接收数据字节数组</param>
  61. void ReceiveDataDecode(byte[] data);
  62. }
  63. public class UART : IUART
  64. {
  65. public int UartIndex;
  66. public object obj = null;
  67. #region 字段
  68. /// <summary>
  69. /// 实例化串口
  70. /// </summary>
  71. protected SerialPort serialPort = new SerialPort();
  72. /// <summary>
  73. /// 接收数据事件
  74. /// </summary>
  75. public Action<int, byte[]> ReceiveDataDecodeEvent;
  76. #endregion
  77. #region 属性
  78. /// <summary>
  79. /// 获取或设置串口的串口号
  80. /// </summary>
  81. public string PortName
  82. {
  83. get { return serialPort.PortName; }
  84. set { serialPort.PortName = value; }
  85. }
  86. /// <summary>
  87. /// 获取或设置串口的波特率
  88. /// </summary>
  89. public int BaudRate
  90. {
  91. get { return serialPort.BaudRate; }
  92. set { serialPort.BaudRate = value; }
  93. }
  94. /// <summary>
  95. /// 获取或设置串口的校验位
  96. /// </summary>
  97. public Parity Parity
  98. {
  99. get { return serialPort.Parity; }
  100. set { serialPort.Parity = value; }
  101. }
  102. /// <summary>
  103. /// 获取或设置串口的数据位
  104. /// </summary>
  105. public int DataBits
  106. {
  107. get { return serialPort.DataBits; }
  108. set { serialPort.DataBits = value; }
  109. }
  110. /// <summary>
  111. /// 获取或设置串口的停止位
  112. /// </summary>
  113. public StopBits StopBits
  114. {
  115. get { return serialPort.StopBits; }
  116. set { serialPort.StopBits = value; }
  117. }
  118. /// <summary>
  119. /// 获取串口的打开状态
  120. /// </summary>
  121. public bool OpenStatus
  122. {
  123. get { return serialPort.IsOpen; }
  124. }
  125. #endregion
  126. /// <summary>
  127. /// 构造函数,设置串口属性及订阅接收事件
  128. /// </summary>
  129. /// <param name="portName">串口号</param>
  130. /// <param name="baudRate">波特率</param>
  131. /// <param name="parity">校验位</param>
  132. /// <param name="dataBits">数据位</param>
  133. /// <param name="stopBits">停止位</param>
  134. public UART(string portName, int baudRate, Parity parity, int dataBits, StopBits stopBits, int uartIndex)
  135. {
  136. this.UartIndex = uartIndex; //编号
  137. this.PortName = portName; //串口号
  138. this.BaudRate = baudRate; //波特率
  139. this.Parity = parity; //校验位
  140. this.DataBits = dataBits; //数据位
  141. this.StopBits = stopBits; //停止位
  142. serialPort.DataReceived += Received;//订阅串口接收事件
  143. }
  144. /// <summary>
  145. /// 打开串口
  146. /// </summary>
  147. /// <returns>true 打开成功,false 打开失败</returns>
  148. public virtual bool Open()
  149. {
  150. string[] str = SerialPort.GetPortNames(); //获取当前计算机的所有串口号
  151. if (str != null && str.Contains(PortName)) //判断当前计算机是否有串口以及是否存在将要打开的串口
  152. {
  153. try
  154. {
  155. serialPort.ReceivedBytesThreshold = 1; //设置接收事件字节数
  156. if (serialPort.IsOpen) serialPort.Close();
  157. serialPort.Open(); //打开串口
  158. serialPort.DiscardInBuffer(); //清空接收缓存区的数据
  159. return true; //串口打开成功
  160. }
  161. catch (Exception) { return false; } //异常,串口打开失败
  162. }
  163. else { return false; } //当前计算机没有串口或将要打开的串口不存在,串口打开失败
  164. }
  165. /// <summary>
  166. /// 关闭串口
  167. /// </summary>
  168. /// <returns>true 关闭成功,false 关闭失败</returns>
  169. public virtual bool Close()
  170. {
  171. try
  172. {
  173. serialPort.Close(); //关闭串口连接
  174. return true; //关闭成功
  175. }
  176. catch { return false; } //异常,关闭失败
  177. }
  178. /// <summary>
  179. /// 发送数据
  180. /// </summary>
  181. /// <param name="message">字符串数据</param>
  182. /// <returns>true 发送成功,false 发送失败</returns>
  183. public virtual bool Send(string message)
  184. {
  185. try
  186. {
  187. serialPort.Write(message); //发送字符串数据
  188. return true; //发送成功
  189. }
  190. catch { return false; } //异常,发送失败
  191. }
  192. /// <summary>
  193. /// 发送数据
  194. /// </summary>
  195. /// <param name="message">字节数组数据</param>
  196. /// <returns>true 发送成功,false 发送失败</returns>
  197. public virtual bool Send(byte[] message)
  198. {
  199. try
  200. {
  201. serialPort.Write(message, 0, message.Length); //发送字节数组数据
  202. return true; //发送成功
  203. }
  204. catch { return false; } //异常,发送失败
  205. }
  206. /// <summary>
  207. /// 接收数据
  208. /// </summary>
  209. /// <param name="sender"></param>
  210. /// <param name="e"></param>
  211. //protected virtual void Received(object sender, SerialDataReceivedEventArgs e)
  212. //{
  213. // int length = serialPort.BytesToRead;
  214. // byte[] buf = new byte[length]; //创建接收数据存储区
  215. // serialPort.Read(buf, 0, length); //将接收缓存区中的数据读取到数据存储区
  216. // serialPort.DiscardInBuffer(); //清空接收缓存区的数据
  217. // ReceiveDataDecode(buf); //调用接收数据解码函数,处理接收数据
  218. //}
  219. protected virtual void Received(object sender, SerialDataReceivedEventArgs e)
  220. {
  221. List<byte> tempBytes = new List<byte>();
  222. while(serialPort.BytesToRead > 0)
  223. {
  224. byte[] buffer = new byte[serialPort.BytesToRead];
  225. serialPort.Read(buffer, 0, buffer.Length);
  226. foreach(byte b in buffer)
  227. {
  228. tempBytes.Add(b);
  229. }
  230. Thread.Sleep(20);
  231. }
  232. byte[] dataBuf = tempBytes.ToArray();
  233. ReceiveDataDecode(dataBuf); //调用接收数据解码函数,处理接收数据
  234. }
  235. /// <summary>
  236. /// 接收数据解码
  237. /// </summary>
  238. /// <param name="data">接收到的数据</param>
  239. public virtual void ReceiveDataDecode(byte[] data)
  240. {
  241. if (ReceiveDataDecodeEvent != null) //判断事件是否被订阅
  242. ReceiveDataDecodeEvent(this.UartIndex,data); //如果被订阅,就发布事件
  243. }
  244. }
  245. }