MySerial.cs 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  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;
  7. using System.Threading.Tasks;
  8. namespace Tps_LQ_Transmitter.com
  9. {
  10. public class MySerial
  11. {
  12. SerialPort serial;
  13. public bool IsOpen
  14. {
  15. get
  16. {
  17. if (serial == null)
  18. return false;
  19. return serial.IsOpen;
  20. }
  21. }
  22. public MySerial()
  23. {
  24. }
  25. public virtual void portClose()
  26. {
  27. }
  28. public bool Init(string com)
  29. {
  30. serial = new SerialPort();
  31. serial.PortName = com; //端口号设置为com_port的值
  32. serial.BaudRate = 9600;
  33. serial.DataBits = 8;
  34. serial.StopBits = StopBits.One;//停止位设置为com_stop的值
  35. serial.Parity = Parity.None;//获取奇偶校验选项的值
  36. serial.ReadTimeout = 1000; //读取等待时间1000
  37. // serial.ReceivedBytesThreshold = 1;
  38. // serial.DataReceived += Serial_DataReceived;
  39. serial.Open();
  40. return serial.IsOpen;
  41. }
  42. /// <summary>
  43. /// 串口COM先写后读方法;
  44. /// 写入的时候会自动在后面添加modbus-CRC16检验
  45. /// </summary>
  46. /// <param name="data">写入的数据</param>
  47. /// <returns>返回的数据</returns>
  48. public virtual byte[] writeAndRead(byte[] data)
  49. {
  50. if (data == null)
  51. return null;
  52. //先读空
  53. if (serial.BytesToRead > 0)
  54. serial.DiscardInBuffer();
  55. byte[] crc = crc16(data);
  56. byte[] newarray = new byte[data.Length + 2];
  57. Array.Copy(data, newarray, data.Length);
  58. newarray[data.Length] = crc[0];
  59. newarray[data.Length + 1] = crc[1];
  60. serial.Write(newarray, 0, newarray.Length);
  61. Thread.Sleep(150);
  62. if(serial.BytesToRead > 0)
  63. {
  64. byte[] dat = new byte[serial.BytesToRead];
  65. serial.Read(dat, 0, dat.Length);
  66. return dat;
  67. }
  68. else
  69. {
  70. return null;
  71. }
  72. }
  73. /// <summary>
  74. /// modbus_CRC16校验
  75. /// </summary>
  76. /// <param name="data">需要校验的byte[]型数据</param>
  77. /// <returns>校验后数据(高位在后,低位在前)</returns>
  78. public byte[] crc16(byte[] data)
  79. {
  80. byte[] crc = new byte[2];
  81. UInt16 wCrc = 0xFFFF;
  82. for (int i = 0; i < data.Length; i++)
  83. {
  84. wCrc ^= Convert.ToUInt16(data[i]);
  85. for (int j = 0; j < 8; j++)
  86. {
  87. if ((wCrc & 0x0001)==1)
  88. {
  89. wCrc >>= 1;
  90. wCrc ^= 0xA001;//异或多项式
  91. }
  92. else
  93. {
  94. wCrc >>= 1;
  95. }
  96. }
  97. }
  98. crc[1] = (byte)((wCrc & 0xFF00) >> 8);//高位在后
  99. crc[0] = (byte)(wCrc & 0x00FF); //低位在前
  100. return crc;
  101. }
  102. private void Serial_DataReceived(object sender, SerialDataReceivedEventArgs e)
  103. {
  104. }
  105. }
  106. }