using RJCP.IO.Ports;
using System;
using System.Collections.Generic;
using System.Data;
using System.IO.Ports;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace LB_SmartVision.Forms.Pages.LEDLightSourceControlPage
{
public delegate void SerialProtStatus(bool status);
public delegate void SerialProtDataReceived(string strInfo);
public class LEDControlSerialPort:LED_CONTROLLER
{
public SerialPort serialPort = new SerialPort();
public StringBuilder strRec = new StringBuilder();
public StringBuilder strRend = new StringBuilder();
public LEDControlParams LEDControlParams = new LEDControlParams();
public event SerialProtStatus serialProtStatus;
public event SerialProtDataReceived serialProtDataReceived;
private void _SerialProtStatus(bool status)
{
if (serialProtStatus != null)
{
serialProtStatus(status);
}
}
private void _SerialProtDataReceived(string strInfo)
{
if (serialProtDataReceived != null)
{
serialProtDataReceived(strInfo);
}
}
void serialPort_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
try
{
if (!serialPort.IsOpen)
{
MessageBox.Show("\r\n串口未打开,请打开后重试");
return;
}
Thread.Sleep(100);
string receiveStr = serialPort.ReadExisting();
serialPort.DiscardInBuffer();
if (receiveStr != "")
{
_SerialProtDataReceived(receiveStr);
}
}
catch (Exception ex)
{
}
}
///
/// 读取返回值
///
/// 串口返回信息
public string Read()
{
try
{
if (!serialPort.IsOpen)
{
MessageBox.Show("\r\n串口未打开,请打开后重试");
return string.Empty;
}
Thread.Sleep(100);
string result = serialPort.ReadExisting();
return result;
}
catch (Exception ex)
{
return string.Empty;
}
}
///
/// 打开串口
///
public void OpenPort()
{
try
{
if (!serialPort.IsOpen)
{
serialPort.NewLine = "\r\n";
serialPort.RtsEnable = false;
serialPort.PortName = LEDControlParams.PortName;
serialPort.BaudRate = LEDControlParams.BaudRate;
serialPort.DataBits = LEDControlParams.DataBit;
serialPort.StopBits = LEDControlParams.StopBit;
serialPort.Parity = LEDControlParams.Parity;
serialPort.Open();
serialPort.DataReceived += new SerialDataReceivedEventHandler(serialPort_DataReceived);
_SerialProtStatus(serialPort.IsOpen);
}
}
catch (Exception ex)
{
}
}
///
/// 关闭串口
///
public void ClosePort()
{
try
{
if (serialPort.IsOpen)
{
serialPort.Close();
}
_SerialProtStatus(false);
}
catch (Exception ex)
{
//Error(ex);
}
}
///
/// 发送信号
///
/// 发送内容
public void Send(string strInfo)
{
if (!serialPort.IsOpen)
{
serialPort.NewLine = "\r\n";
serialPort.RtsEnable = false;
serialPort.PortName = LEDControlParams.PortName;
serialPort.BaudRate = LEDControlParams.BaudRate;
serialPort.DataBits = LEDControlParams.DataBit;
serialPort.StopBits = LEDControlParams.StopBit;
serialPort.Parity = LEDControlParams.Parity;
serialPort.Open();
_SerialProtStatus(serialPort.IsOpen);
}
if (string.IsNullOrEmpty(strInfo))
{
MessageBox.Show("\r\n不能发送空字符串");
return;
}
serialPort.ReadExisting();
serialPort.WriteLine(strInfo);
}
///
/// 232通讯设置亮度
///
///
///
///
public string SetIntensity(string ch, string value)
{
string value_str = Convert.ToInt32(value).ToString("X");
if (value_str.Length == 1)
{
value_str = "00" + value_str;
}
switch (value_str.Length)
{
case 1:
value_str = "00" + value_str;
break;
case 2:
value_str = "0" + value_str;
break;
default:
break;
}
string msg = "$3" + ch + value_str;
msg = msg + GetXorResualt(msg);
serialPort.Write(msg);
Thread.Sleep(30);
strRend = new StringBuilder(msg);
return strRec.ToString();
}
///
/// 485通讯设置亮度
///
///
///
///
///
public string SetIntensity(string ch, string value, string id485)
{
string value_str = Convert.ToInt32(value).ToString("X");
if (value_str.Length == 1)
{
value_str = "00" + value_str;
}
switch (value_str.Length)
{
case 1:
value_str = "00" + value_str;
break;
case 2:
value_str = "0" + value_str;
break;
default:
break;
}
string ID_485 = Convert.ToInt32(id485).ToString("X");
if (ID_485.Length == 1)
{
ID_485 = "0" + ID_485;
}
string msg = "$" + ID_485 + "3" + ch + value_str;
msg = msg + GetXorResualt(msg);
serialPort.Write(msg);
Thread.Sleep(30);
strRend = new StringBuilder(msg);
return strRec.ToString();
}
public string OpenAllChannel()
{
throw new NotImplementedException();
}
public string OpenChannel(string ch)
{
throw new NotImplementedException();
}
public string CloseALLChannel()
{
throw new NotImplementedException();
}
public string CloseChannel(string ch)
{
throw new NotImplementedException();
}
///
/// 232获取对应通道亮度值
///
///
///
///
public string GetIntensity(string ch)
{
try
{
string dataRec = "$4" + ch + "000";
dataRec = dataRec + GetXorResualt(dataRec);
serialPort.Write(dataRec);
Thread.Sleep(100);
dataRec = strRec.ToString();
dataRec = dataRec.Substring(3, 3);
int convertTodec = Convert.ToInt32(dataRec, 16);
return convertTodec.ToString();
}
catch (Exception)
{
return "0";
}
}
///
/// 485获取对应通道亮度值
///
///
///
///
public string GetIntensity(string ch, string id485)
{
try
{
string ID_485 = Convert.ToInt32(id485).ToString("X");
if (ID_485.Length == 1)
{
ID_485 = "0" + ID_485;
}
string dataRec = "$" + ID_485 + "4" + ch + "000";
dataRec = dataRec + GetXorResualt(dataRec);
serialPort.Write(dataRec);
Thread.Sleep(100);
dataRec = strRec.ToString();
dataRec = dataRec.Substring(5, 3);
int convertTodec = Convert.ToInt32(dataRec, 16);
return convertTodec.ToString();
}
catch (Exception)
{
return "0";
}
}
public string GetONorOFF()
{
throw new NotImplementedException();
}
public string GetXorResualt(string msg)
{
//获取字节数组
byte[] b = Encoding.ASCII.GetBytes(msg);
// xorResult 存放校验结注意:初值首元素值
byte xorResult = b[0];
// 求xor校验注意:XOR运算第二元素始
for (int i = 1; i < b.Length; i++)
{
xorResult ^= b[i];
}
// 运算xorResultXOR校验结,^=为异或符号
// MessageBox.Show();
return xorResult.ToString("X");
}
}
}