PcmControl.cs 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. using System.IO.Ports;
  7. using System.Threading;
  8. namespace Tps_LQ_Transmitter.com
  9. {
  10. /// <summary>
  11. /// PCM控制与数据发送类
  12. /// </summary>
  13. public class PcmControl:MySerial
  14. {
  15. SerialPort serial = null;
  16. public PcmControl()
  17. {
  18. serial = new SerialPort();
  19. serial.PortName = "COM5"; //PCM模块是RS232通信共用计算机的串口COM5
  20. serial.BaudRate = 115200;
  21. serial.DataBits = 8;
  22. serial.StopBits = StopBits.One;//停止位设置为com_stop的值
  23. serial.Parity = Parity.None;//获取奇偶校验选项的值
  24. serial.ReadTimeout = 1000; //读取等待时间1000
  25. serial.RtsEnable = true;
  26. //this.DataReceived += new System.IO.Ports.SerialErrorReceivedEventHandler(this.Serial_DataReceived);
  27. if (!serial.IsOpen)
  28. {
  29. serial.Open();
  30. }
  31. }
  32. public override void portClose()
  33. {
  34. serial.Close();
  35. }
  36. /// <summary>
  37. /// PCM读写方法
  38. /// </summary>
  39. /// <param name="data">数据</param>
  40. /// <param name="delay">延时</param>
  41. /// <returns></returns>
  42. public byte[] WriteRead(byte[] data, int delay = 50)
  43. {
  44. if (data == null)
  45. return null;
  46. //先读空
  47. if (serial.BytesToRead > 0)
  48. serial.DiscardInBuffer();
  49. byte[] crc = crc16(data);
  50. byte[] newarray = new byte[data.Length + 2];
  51. Array.Copy(data, newarray, data.Length);
  52. newarray[data.Length] = crc[0];
  53. newarray[data.Length + 1] = crc[1];
  54. serial.Write(data, 0, data.Length);
  55. Thread.Sleep(delay);
  56. if (serial.BytesToRead > 0)
  57. {
  58. byte[] dat = new byte[serial.BytesToRead];
  59. serial.Read(dat, 0, dat.Length);
  60. return dat;
  61. }
  62. else
  63. {
  64. return data;
  65. }
  66. }
  67. /// <summary>
  68. /// PCM仅读方法
  69. /// </summary>
  70. /// <returns></returns>
  71. public byte[] OnlyRead()
  72. {
  73. if (serial.IsOpen == true)
  74. {
  75. if (serial.BytesToRead > 0)
  76. {
  77. byte[] dat = new byte[serial.BytesToRead];
  78. serial.Read(dat, 0, dat.Length);
  79. return dat;
  80. }
  81. else
  82. {
  83. return null;
  84. }
  85. }
  86. else
  87. {
  88. return null;
  89. }
  90. }
  91. /// <summary>
  92. /// PCM设置命令发送
  93. /// </summary>
  94. /// <param name="mode">发送模式选择:"UART"/"HDLC"</param>
  95. /// <param name="choice">"ODD"/"EVEN"/"NONE"/"FALL"/"RISE"</param>
  96. /// <param name="baudrate">波特率</param>
  97. /// <returns>结果</returns>
  98. public bool Setting(string mode,string choice,int baudrate )
  99. {
  100. int u = 0;
  101. if (mode.ToUpper()=="UART")
  102. {
  103. u = u | 0x01;
  104. }
  105. else if (mode.ToUpper() == "HDLC")
  106. {
  107. u = u | 0x41;
  108. }
  109. if (choice.ToUpper() == "ODD")//奇校验
  110. {
  111. u = u | 0x02;
  112. }
  113. else if (choice.ToUpper() == "EVEN")//偶校验
  114. {
  115. u = u | 0x04;
  116. }
  117. else if (choice.ToUpper() == "NONE")//无校验
  118. {
  119. u = u | 0x00;
  120. }
  121. else if (choice.ToUpper() == "FALL")//下降沿
  122. {
  123. u = u | 0x08;
  124. }
  125. else if (choice.ToUpper() == "RISE")//上升沿
  126. {
  127. u = u | 0x00;
  128. }
  129. int d =((50000000 / baudrate) + 2);
  130. bool bolrd = false;
  131. byte[] byst = { 0xF0, 0x0F, 0x02, 0x00, 0x00, 0x03, 0x00, 0xDB, 0x01 };
  132. byst[8] = (byte)u;
  133. byst[6] = (byte)((d & 0x0000ff00) >> 8);
  134. byst[7] = (byte)(d & 0x000000ff);
  135. byte[] byrd = WriteRead(byst);
  136. if (byrd.Length>= byst.Length)
  137. {
  138. bolrd = true;
  139. }
  140. return bolrd;
  141. }
  142. /// <summary>
  143. /// PCM数据发送
  144. /// </summary>
  145. /// <param name="data"></param>
  146. /// <returns></returns>
  147. public bool DataSend(byte[] data,int delay=50)
  148. {
  149. bool bolrd = false;
  150. if (data!=null && data.Length>0)
  151. {
  152. byte[] sd = new byte[data.Length + 6];
  153. sd[0] = 0xF0;
  154. sd[1] = 0x0F;
  155. sd[2] = 0x03;
  156. sd[3] = 0x00;
  157. sd[4] = 0x00;
  158. sd[5] = (byte)data.Length;
  159. for (int i = 0; i < data.Length; i++)
  160. {
  161. sd[6 + i] = data[i];
  162. }
  163. byte[] byrd = WriteRead(sd, delay);
  164. if (byrd.Length >= sd.Length)
  165. {
  166. bolrd = true;
  167. }
  168. }
  169. return bolrd;
  170. }
  171. public void Serial_DataReceived(object sender, SerialDataReceivedEventArgs e)
  172. {
  173. //
  174. //
  175. }
  176. }
  177. }