PcmControl.cs 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208
  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. class PcmControl:MySerial
  14. {
  15. SerialPort serial = null;
  16. public PcmControl()
  17. {
  18. serial = new SerialPort();
  19. serial.PortName = "COM5"; //DIO控制板与JSY模块都是RS485通信共用计算机的串口COM6
  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 null;
  65. }
  66. }
  67. public byte[] OnlyRead()
  68. {
  69. if (serial.BytesToRead > 0)
  70. {
  71. byte[] dat = new byte[serial.BytesToRead];
  72. serial.Read(dat, 0, dat.Length);
  73. return dat;
  74. }
  75. else
  76. {
  77. return null;
  78. }
  79. }
  80. /// <summary>
  81. /// PCM设置命令发送
  82. /// </summary>
  83. /// <param name="mode">"UART"/"HDLC"</param>
  84. /// <param name="choice">"ODD"/"EVEN"/"NONE"/"FALL"/"RISE"</param>
  85. /// <param name="baudrate">波特率</param>
  86. /// <returns>结果</returns>
  87. public bool Setting(string mode,string choice,int baudrate )
  88. {
  89. int u = 0;
  90. if (mode.ToUpper()=="UART")
  91. {
  92. u = u | 0x01;
  93. }
  94. else if (mode.ToUpper() == "HDLC")
  95. {
  96. u = u | 0x41;
  97. }
  98. if (choice.ToUpper() == "ODD")//奇校验
  99. {
  100. u = u | 0x02;
  101. }
  102. else if (choice.ToUpper() == "EVEN")//偶校验
  103. {
  104. u = u | 0x04;
  105. }
  106. else if (choice.ToUpper() == "NONE")//无校验
  107. {
  108. u = u | 0x00;
  109. }
  110. else if (choice.ToUpper() == "FALL")//下降沿
  111. {
  112. u = u | 0x08;
  113. }
  114. else if (choice.ToUpper() == "RISE")//上升沿
  115. {
  116. u = u | 0x00;
  117. }
  118. int d =((50000000 / baudrate) + 2);
  119. bool bolrd = false;
  120. byte[] byst = { 0xF0, 0x0F, 0x02, 0x00, 0x00, 0x03, 0x00, 0xDB, 0x01 };
  121. byst[8] = (byte)u;
  122. byst[6] = (byte)((d & 0x0000ff00) >> 8);
  123. byst[7] = (byte)(d & 0x000000ff);
  124. byte[] byrd = WriteRead(byst);
  125. if (byrd.Length>= byst.Length)
  126. {
  127. bolrd = true;
  128. }
  129. return bolrd;
  130. }
  131. public bool UartSendSetting()
  132. {
  133. bool bolrd = false;
  134. byte[] byst = { 0xF0, 0x0F, 0x02, 0x00, 0x00, 0x03, 0x00, 0xDB, 0x01 };
  135. byte[] byrd = new byte[10];
  136. byte[] byrdx = { 0xF0, 0x0F, 0x02, 0x00, 0x00, 0x03, 0x00, 0xDB, 0x01 ,0x24};
  137. byrd=WriteRead(byst);
  138. if (byrd.Length >= 10)
  139. {
  140. bolrd = true;
  141. for (int i = 0; i < byrdx.Length; i++)
  142. {
  143. if (byrd[i] != byrdx[i])
  144. bolrd = false;
  145. }
  146. }
  147. return bolrd;
  148. }
  149. public bool HdlcSendSetting()
  150. {
  151. bool bolrd = false;
  152. byte[] byst = { 0xF0, 0x0F, 0x02, 0x00, 0x00, 0x03, 0x00, 0x0D, 0x41 };
  153. byte[] byrd = new byte[10];
  154. byte[] byrdx = { 0xF0, 0x0F, 0x02, 0x00, 0x00, 0x03, 0x00, 0x0D, 0x41, 0xB2 };
  155. byrd = WriteRead(byst);
  156. if (byrd.Length >= 10)
  157. {
  158. bolrd = true;
  159. for (int i = 0; i < byrdx.Length; i++)
  160. {
  161. if (byrd[i] != byrdx[i])
  162. bolrd = false;
  163. }
  164. }
  165. return bolrd;
  166. }
  167. public bool DataSend(byte[] data)
  168. {
  169. bool bolrd = false;
  170. if (data!=null && data.Length>0)
  171. {
  172. byte[] sd = new byte[data.Length + 6];
  173. sd[0] = 0xF0;
  174. sd[1] = 0x0F;
  175. sd[2] = 0x03;
  176. sd[3] = 0x00;
  177. sd[4] = 0x00;
  178. sd[5] = (byte)data.Length;
  179. for (int i = 0; i < data.Length; i++)
  180. {
  181. sd[6 + i] = data[i];
  182. }
  183. byte[] byrd = WriteRead(sd);
  184. if (byrd.Length >= sd.Length)
  185. {
  186. bolrd = true;
  187. }
  188. }
  189. return bolrd;
  190. }
  191. public void Serial_DataReceived(object sender, SerialDataReceivedEventArgs e)
  192. {
  193. //
  194. //
  195. }
  196. }
  197. }