2020-10-09

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.IO.Ports;
using System.Threading;
using System;
using System.Text;

public class TaskBase
{
    public int id;//任务唯一ID
    public CmdType cmdType;
    public TargetAddress targetAddress;

    public TaskBase(CmdType cmdType, TargetAddress targetAddress)
    {
        this.cmdType = cmdType;
        this.targetAddress = targetAddress;
    }
}

public class Root : MonoBehaviour
{
    SerialPort port;//串口实例
    string ComStr = "COM5";//串口名
    Thread recvThread;//接收数据线程
    byte[] receiveBytes;//接收数据字节组
    int SendTime;//发送指令时的时间
    List<TaskBase> MyTaskTable = new List<TaskBase>();
    bool Receiving;//是否等待信号返回中,T为是

    void Start()
    {
        port = new SerialPort(ComStr, 115200, Parity.None, 8, StopBits.One);

        //串口初始化
        if (!port.IsOpen)
            port.Open();

        recvThread = new Thread(ReceiveData); //该线程用于接收串口数据
        recvThread.Start();
    }

    private void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space))
        {
            for (int i = 0; i < 20; i++)
                AddTaskFunction(new TaskBase(CmdType.StateQuery, TargetAddress.Defibrillator));
        }
    }

    /// <summary>
    /// 添加任务
    /// </summary>
    /// <param name="cmdType"></param>
    /// <param name="targetAddress"></param>
    void AddTaskFunction(TaskBase task)
    {
        //int cacheID = MyTaskTable.Count;//在这里设置ID
        MyTaskTable.Add(task);
    }

    /// <summary>
    /// 发送数据
    /// </summary>
    void SendData()
    {
        if (MyTaskTable.Count <= 0)
            return;
        TaskBase task = MyTaskTable[0];

        Byte[] bytes = new Byte[9];
        bytes[0] = 0x90;//起始
        bytes[1] = 0xEB;//起始
        switch (task.cmdType)//命令
        {
            case CmdType.Heart:
                bytes[2] = 0x01;
                break;
            case CmdType.StartCheck:
                bytes[2] = 0x02;
                break;
            case CmdType.OverCheck:
                bytes[2] = 0x03;
                break;
            case CmdType.StateQuery:
                bytes[2] = 0x04;
                break;
            case CmdType.OutPutCtrl:
                bytes[2] = 0x05;
                break;
            case CmdType.DragCtrl:
                bytes[2] = 0x06;
                break;
            case CmdType.ClearEncoder:
                bytes[2] = 0x07;
                break;
            case CmdType.AedCtrl:
                bytes[2] = 0x08;
                break;
            default:
                break;
        }
        switch (task.targetAddress)//接收地址
        {
            case TargetAddress.Host:
                bytes[3] = 0x00;
                break;
            case TargetAddress.Pad:
                bytes[3] = 0x10;
                break;
            case TargetAddress.Defibrillator:
                bytes[3] = 0x20;
                break;
            case TargetAddress.AED:
                bytes[3] = 0x30;
                break;
            case TargetAddress.Human:
                bytes[3] = 0x40;
                break;
            default:
                break;
        }
        bytes[4] = 0x00;//发送地址
        bytes[5] = 0x01;//长度
        bytes[6] = 0x00;//数据
        bytes[7] = 0xDA;//校验
        bytes[8] = 0xFF;//校验

        StringBuilder sb = new StringBuilder();
        sb.Append(Convert.ToString(bytes[0], 16));
        sb.Append("-");
        sb.Append(Convert.ToString(bytes[1], 16));
        sb.Append("-");
        sb.Append(Convert.ToString(bytes[2], 16));
        sb.Append("-");
        sb.Append(Convert.ToString(bytes[3], 16));
        sb.Append("-");
        sb.Append(Convert.ToString(bytes[4], 16));
        sb.Append("-");
        sb.Append(Convert.ToString(bytes[5], 16));
        sb.Append("-");
        sb.Append(Convert.ToString(bytes[6], 16));
        sb.Append("-");
        sb.Append(Convert.ToString(bytes[7], 16));
        sb.Append("-");
        sb.Append(Convert.ToString(bytes[8], 16));

        Debug.LogWarning("发送的数据:" + sb.ToString() + "         数据长度为:" + bytes.Length);

        DataSend(bytes, bytes.Length);
        SendTime = GetTime();
    }

    /// <summary>
    /// 接收数据
    /// </summary>
    private void ReceiveData()
    {
        try
        {
            if (port.IsOpen)
                Debug.LogError("成功打开串口:" + ComStr);

            while (true)
            {
                Thread.Sleep(20);

                if (!port.IsOpen)//串口没开-跳出线程
                    return;

                Debug.Log("接收线程运行中...");

                int datalength = port.BytesToRead;
                if (datalength == 0)//长度为0-无返回数据
                {
                    if (MyTaskTable.Count > 0 && !Receiving)//无数据返回的时候,判断是否有任务和是否正在等待接收
                    {
                        SendData(); Receiving = true;//有任务且不等待,则发送下一个任务,并且进入等待接收
                    }
                }
                else
                {
                    receiveBytes = new byte[datalength];
                    port.Read(receiveBytes, 0, datalength);
                    bool result = CheckSumFun(receiveBytes);

                    if (result)
                    {
                        StringBuilder sb = new StringBuilder();
                        for (int i = 0; i < datalength; i++)
                        {
                            sb.Append(Convert.ToString(receiveBytes[i], 16));
                            sb.Append("-");
                        }
                        Debug.LogError("接收的数据:" + sb.ToString() + "         数据长度为:" + datalength + "    本次处理时长为:" + (GetTime() - SendTime));
                        //接收过一次返回后,清空本次任务,并且进入非等待接收状态
                        MyTaskTable.Remove(MyTaskTable[0]);
                    }
                    else
                    {
                        Debug.LogError("接收数据检验和结果不正确");
                    }

                    Receiving = false;//进入非等待接收状态
                }
            }
        }
        catch (Exception ex)
        {
            Debug.LogError("接受串口数据错误:" + ex);
        }
    }

    /// <summary>
    /// 检查校验和  T:合法 F:非法
    /// </summary>
    bool CheckSumFun(byte[] receiveBytes)
    {
        
    }

    /// <summary>
    /// 获取当前系统时间(毫秒
    /// </summary>
    /// <returns></returns>
    int GetTime()
    {
        string timeStr = DateTime.Now.ToString("ss:fff");
        string[] strs = timeStr.Split(':');
        int currentTime = int.Parse(strs[0]) * 1000;
        return currentTime += int.Parse(strs[1]);
    }

    /// <summary>
    /// 数据发送
    /// </summary>
    /// <param name="data"></param>
    /// <param name="count"></param>
    public void DataSend(Byte[] data, int count)
    {
        port.Write(data, 0, count);
    }

    private void OnDisable()
    {
        if (port.IsOpen)
            port.Close();//关闭串口
    }

    private void OnApplicationQuit()
    {
        if (port.IsOpen)
            port.Close();//关闭串口
    }
}

/// <summary>
/// 命令类型
/// </summary>
public enum CmdType
{
    None,
    Heart,//0x01
    StartCheck,//0x02
    OverCheck,//0x03
    StateQuery,//0x04
    OutPutCtrl,//0x05
    DragCtrl,//0x06
    ClearEncoder,//0x07
    AedCtrl//0x08
}

/// <summary>
/// 目标地址
/// </summary>
public enum TargetAddress
{
    None,
    Host,//0x00
    Pad,//0x10
    Defibrillator,//0x20 
    AED,//0x30
    Human//0x40
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值