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
}
06-08
3234
03-14
1080