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)
|
{
|
}
|
}
|
/// <summary>
|
/// 读取返回值
|
/// </summary>
|
/// <returns>串口返回信息</returns>
|
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;
|
}
|
}
|
/// <summary>
|
/// 打开串口
|
/// </summary>
|
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)
|
{
|
}
|
}
|
|
/// <summary>
|
/// 关闭串口
|
/// </summary>
|
public void ClosePort()
|
{
|
try
|
{
|
if (serialPort.IsOpen)
|
{
|
serialPort.Close();
|
}
|
_SerialProtStatus(false);
|
}
|
catch (Exception ex)
|
{
|
//Error(ex);
|
}
|
}
|
/// <summary>
|
/// 发送信号
|
/// </summary>
|
/// <param name="strInfo">发送内容</param>
|
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);
|
}
|
/// <summary>
|
/// 232通讯设置亮度
|
/// </summary>
|
/// <param name="ch"></param>
|
/// <param name="value"></param>
|
/// <returns></returns>
|
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();
|
}
|
|
/// <summary>
|
/// 485通讯设置亮度
|
/// </summary>
|
/// <param name="ch"></param>
|
/// <param name="value"></param>
|
/// <param name="id485"></param>
|
/// <returns></returns>
|
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();
|
}
|
/// <summary>
|
/// 232获取对应通道亮度值
|
/// </summary>
|
/// <param name="ch"></param>
|
/// <returns></returns>
|
/// <exception cref="NotImplementedException"></exception>
|
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";
|
}
|
}
|
|
/// <summary>
|
/// 485获取对应通道亮度值
|
/// </summary>
|
/// <param name="ch"></param>
|
/// <param name="id485"></param>
|
/// <returns></returns>
|
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");
|
}
|
}
|
}
|