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();


        }

 

posted @ 2018-03-21 12:00  微笑的''80  阅读(222)  评论(0)    收藏  举报