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"); } } }