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)
{
//
//
}
}
}