pd6024 光源hex指令封装
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Diagnostics;
using System.IO.Ports;
namespace Lighting
{
/// <summary>
/// wordop pd6024光源
/// </summary>
public class PD6024
{
static char head = '@';
static StringBuilder sb = new StringBuilder();
public static string sendcmd(string chanel, string cmdtype, string data, string id)
{
sb.Clear();
//sb.Append(head);
switch (chanel)
{
case "L1":
chanel = "00";
break;
case "L2":
chanel = "01";
break;
case "L3":
chanel = "02";
break;
case "L4":
chanel = "03";
break;
default:
break;
}
sb.Append(StringToHexString(chanel, Encoding.Default));
switch (cmdtype)
{
case "F": //亮度(data:0-255)
cmdtype = "F";
sb.Append(StringToHexString(cmdtype, Encoding.Default));
sb.Append(StringToHexString(data, Encoding.Default));
break;
case "S": //触发方式(data:F00-F10)
cmdtype = "S";
sb.Append(StringToHexString(cmdtype, Encoding.Default));
if (data.StartsWith("F"))
{
sb.Append(StringToHexString(data.Substring(1, data.Length - 1), Encoding.Default));
}
break;
case "O": //查询指令返回
cmdtype = "O";
break;
case "N": //查询指令返回
cmdtype = "N";
break;
default:
break;
}
sb.Append(StringToHexString(id, Encoding.Default));
string check_str = HexStringToString(sb.ToString(), Encoding.Default);
//check_str = check_str.Substring(1, check_str.Length - 1);
int count = checkSum(Encoding.Default.GetBytes(check_str)) + (int)head;
string count_str = count.ToString("X2").Substring(1, count.ToString("X2").Length - 1);
count_str = StringToHexString(count_str, Encoding.Default);
return "0x40 " + sb.ToString() + count_str + "0x0D" + " 0x0A";
}
public static string StringToHexString(string s, Encoding encode)
{
byte[] b = encode.GetBytes(s);//按照指定编码将string编程字节数组
string result = string.Empty;
for (int i = 0; i < b.Length; i++)//逐字节变为16进制字符,以%隔开
{
result += "0x" + Convert.ToString(b[i], 16) + " ";
}
return result;
}
public static string HexStringToString(string hs, Encoding encode)
{
//以%分割字符串,并去掉空字符
string[] chars = hs.Split(new string[] { " " }, StringSplitOptions.RemoveEmptyEntries);
byte[] b = new byte[chars.Length];
//逐个字符变为16进制字节数据
for (int i = 0; i < chars.Length; i++)
{
b[i] = Convert.ToByte(chars[i], 16);
}
//按照指定编码将字节数组变为字符串
return encode.GetString(b);
}
private static Int16 checkSum(byte[] memorySpage)
{
int num = 0;
for (int i = 0; i < memorySpage.Length; i++)
{
num = (num + memorySpage[i]) % 0xffff;
}
//实际上num 这里已经是结果了,如果只是取int 可以直接返回了
memorySpage = BitConverter.GetBytes(num);
//返回累加校验和
return BitConverter.ToInt16(new byte[] { memorySpage[0], memorySpage[1] }, 0);
}
public static SerialPort serialport = new SerialPort();
public static bool isSend = false; //发送控制
public static string comNotice = string.Empty;// 串口接收的信息
public static bool initPort(string s_port, int BaudRate)
{
serialport.PortName = s_port;
serialport.Parity = Parity.None;
serialport.BaudRate = BaudRate;
serialport.DataBits = 8;
serialport.StopBits = StopBits.One;
serialport.Open();
serialport.DataReceived += new SerialDataReceivedEventHandler(serialport_DataReceived);
if (serialport.IsOpen)
{
return true;
}
else
{
return false;
}
}
public static void closePort()
{
serialport.Close();
serialport.Dispose();
}
static void serialport_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
byte[] buffer = new byte[255];
int resive = serialport.Read(buffer, 0, 255);
//if (resive == "▪▪0010000▪▪")
//{
// serialport.DiscardOutBuffer();
// serialport.Write(cmd.ToString());
// Thread.Sleep(3000);
//}
//resive = serialport.ReadLine();
new Action(() =>
{
comNotice = System.Text.ASCIIEncoding.Default.GetString(buffer);
serialport.DiscardOutBuffer();
}).Invoke();
}
}
}
控制台测试:
static void Main(string[] args)
{
// string data = "0x400x300x320x530x300x330x300x310x420x390x0D0x0A";
// string ss = HexStringToString(data, Encoding.Default);
// data = data.Substring(1, data.Length - 1);
string ss = PD6024.sendcmd("L2", "F", "123", "02");
// char head = '@';
//int count = checkSum(Encoding.Default.GetBytes(HexStringToString(ss, Encoding.Default))) + (int)head;
Console.WriteLine("s1={0}", ss);
Console.WriteLine("s2={0}", PD6024.HexStringToString(ss, Encoding.Default));
// Console.WriteLine("s={0}", StringToHexString(count.ToString(), Encoding.Default));
Console.ReadLine();
}

浙公网安备 33010602011771号