using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.IO.Ports; using System.Threading; namespace Tps_LQ_Transmitter.com { /// /// PCM控制与数据发送类 /// class PcmControl:MySerial { SerialPort serial = null; public PcmControl() { serial = new SerialPort(); serial.PortName = "COM5"; //PCM模块是RS232通信共用计算机的串口COM5 serial.BaudRate = 115200; serial.DataBits = 8; serial.StopBits = StopBits.One;//停止位设置为com_stop的值 serial.Parity = Parity.None;//获取奇偶校验选项的值 serial.ReadTimeout = 1000; //读取等待时间1000 serial.RtsEnable = true; //this.DataReceived += new System.IO.Ports.SerialErrorReceivedEventHandler(this.Serial_DataReceived); if (!serial.IsOpen) { serial.Open(); } } public override void portClose() { serial.Close(); } /// /// PCM读写方法 /// /// 数据 /// 延时 /// public byte[] WriteRead(byte[] data, int delay = 50) { if (data == null) return null; //先读空 if (serial.BytesToRead > 0) serial.DiscardInBuffer(); byte[] crc = crc16(data); byte[] newarray = new byte[data.Length + 2]; Array.Copy(data, newarray, data.Length); newarray[data.Length] = crc[0]; newarray[data.Length + 1] = crc[1]; serial.Write(data, 0, data.Length); Thread.Sleep(delay); if (serial.BytesToRead > 0) { byte[] dat = new byte[serial.BytesToRead]; serial.Read(dat, 0, dat.Length); return dat; } else { return data; } } /// /// PCM仅读方法 /// /// public byte[] OnlyRead() { if (serial.IsOpen == true) { if (serial.BytesToRead > 0) { byte[] dat = new byte[serial.BytesToRead]; serial.Read(dat, 0, dat.Length); return dat; } else { return null; } } else { return null; } } /// /// PCM设置命令发送 /// /// 发送模式选择:"UART"/"HDLC" /// "ODD"/"EVEN"/"NONE"/"FALL"/"RISE" /// 波特率 /// 结果 public bool Setting(string mode,string choice,int baudrate ) { int u = 0; if (mode.ToUpper()=="UART") { u = u | 0x01; } else if (mode.ToUpper() == "HDLC") { u = u | 0x41; } if (choice.ToUpper() == "ODD")//奇校验 { u = u | 0x02; } else if (choice.ToUpper() == "EVEN")//偶校验 { u = u | 0x04; } else if (choice.ToUpper() == "NONE")//无校验 { u = u | 0x00; } else if (choice.ToUpper() == "FALL")//下降沿 { u = u | 0x08; } else if (choice.ToUpper() == "RISE")//上升沿 { u = u | 0x00; } int d =((50000000 / baudrate) + 2); bool bolrd = false; byte[] byst = { 0xF0, 0x0F, 0x02, 0x00, 0x00, 0x03, 0x00, 0xDB, 0x01 }; byst[8] = (byte)u; byst[6] = (byte)((d & 0x0000ff00) >> 8); byst[7] = (byte)(d & 0x000000ff); byte[] byrd = WriteRead(byst); if (byrd.Length>= byst.Length) { bolrd = true; } return bolrd; } /// /// PCM数据发送 /// /// /// public bool DataSend(byte[] data,int delay=50) { bool bolrd = false; if (data!=null && data.Length>0) { byte[] sd = new byte[data.Length + 6]; sd[0] = 0xF0; sd[1] = 0x0F; sd[2] = 0x03; sd[3] = 0x00; sd[4] = 0x00; sd[5] = (byte)data.Length; for (int i = 0; i < data.Length; i++) { sd[6 + i] = data[i]; } byte[] byrd = WriteRead(sd, delay); if (byrd.Length >= sd.Length) { bolrd = true; } } return bolrd; } public void Serial_DataReceived(object sender, SerialDataReceivedEventArgs e) { // // } } }