unity 串口通信(简洁版)

硬件逻辑处理:开启、读信号、写信号、关闭

using System;
using System.Collections;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.IO.Ports;
using System.Threading.Tasks;
using UnityEngine;
using UnityEngine.SceneManagement;
using UnityEngine.Events;
using System.Text;

/// <summary>
/// 罐笼硬件联动控制
/// </summary>
public class CageSerial : MonoBehaviour
{
    public SerialPort serialPortCom9;//串口通信 - COM9 -- 罐笼联动
    [HideInInspector] public string Com9;//可读取开关值
    bool com9Open;
    BlockingCollection<byte[]> buffers9 = new BlockingCollection<byte[]>();//数列

    public ErrorRecord errorRecord;

    [HideInInspector]public int cageValue;
    private async void Start()
    {
        SetCom9();
        CageHoming();
        //await Task.Run(() => Read());
        await Task.Run(() => Send9());

    }

    /// <summary>
    ///  给COM9写入命令
    /// </summary>
    async void Send9()
    {
        while (serialPortCom9.IsOpen)
        {
            var temp = buffers9.Take();
            serialPortCom9.Write(temp, 0, temp.Length);//写入
            Debug.Log("写入");
            await Task.Delay(10);
        }
    }

    /// <summary>
    /// 开启con9  -- 罐笼联动
    /// </summary>
    public void SetCom9()
    {
        string sceneName = SceneManager.GetActiveScene().name.Substring(1, 1);
        List<string> subject = new List<string> { "2", "4" };

        if (!subject.Contains(sceneName)) return;

        Com9 = SerialData.cageCom;
        try
        {
            serialPortCom9 = new SerialPort(Com9, 115200, Parity.None, 8, StopBits.One);

            serialPortCom9.Open();//开启串口7
            com9Open = true;
        }
        catch (Exception ex)
        {
            HintAnomaly(ex.ToString());
            Debug.LogError(ex);

            serialPortCom9.Close();
            serialPortCom9.Dispose();
        }

     
    }

    /// <summary>
    /// 提示与硬件连接异常
    /// </summary>
    public void HintAnomaly(string error)
    {
        errorRecord.Write(error);
    }

    /// <summary>
    /// 罐笼上升
    /// </summary>
    public void CageUp()
    {
        byte[] data = new byte[] { 0x95, 0x00, 0x0D, 0x0A };
        serialPortCom9.Write(data, 0, data.Length);
    }

    /// <summary>
    /// 罐笼下降
    /// </summary>
    public void CageDown()
    {
        byte[] data = new byte[] { 0x95, 0x78, 0x0D, 0x0A };
        serialPortCom9.Write(data, 0, data.Length);
    }

    /// <summary>
    /// 罐笼到达中途
    /// </summary>
    public void CageArriveMidway() 
    {
        byte[] data = new byte[] { 0x95, 0x3C, 0x0D, 0x0A };
        serialPortCom9.Write(data, 0, data.Length);
    }

    private void OnDisable()
    {
        CloseCom();
    }
    /// <summary>
    /// 罐笼归位
    /// </summary>
    async void CageHoming() 
    {
        byte[] data = new byte[] { 0x97, 0x00, 0x0D, 0x0A };//校准位置
        serialPortCom9.Write(data, 0, data.Length);
        await Task.Delay(100);
        byte[] data2 = new byte[] { 0x95, 0x78, 0x0D, 0x0A };//罐笼到达最低位(以右侧罐笼为准)
        serialPortCom9.Write(data2, 0, data2.Length);
    }

    /// <summary>
    /// 读参数
    /// </summary>
    async void Read()
    {
        try
        {
            while (serialPortCom9.IsOpen)
            {
                byte[] data = new byte[] { 0x96, 0x00, 0x0D, 0x0A };
                serialPortCom9.Write(data, 0, data.Length);
                
                await Task.Delay(500);
                int length = serialPortCom9.BytesToRead;

                if (length > 1)
                {
                    byte[] receive = new byte[1];
                    serialPortCom9.Read(receive, 0, 1);

    
                    if (receive[0] == 0x96)
                    {
                        serialPortCom9.Read(receive, 0, 1);
                        Debug.Log($"罐笼{receive[0]}");
                        cageValue = receive[0];
                        
                        Debug.Log(cageValue);
                    }
                }
                await Task.Delay(500);
            }
        }
        catch (Exception ex)
        {
            Debug.LogError("com9:"+ex);
        }
    }



    /// <summary>
    /// 关闭com口
    /// </summary>
    public void CloseCom() 
    {
        serialPortCom9.Close();
        serialPortCom9.Dispose();
    }


    public void CloseCom(UnityAction unityAction) 
    {
        try
        {
            if (serialPortCom9.IsOpen)
            {
                serialPortCom9.Close();
                serialPortCom9.Dispose();
            }
            unityAction?.Invoke();
        }
        catch (System.Exception ex)
        {
            HintAnomaly(ex.ToString());
            Debug.LogError(ex);
        }
    }
}

com获取外部配置

using GLHttpUtils;
using Lander;
using Newtonsoft.Json;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

/// <summary>
/// 硬件数据
/// </summary>
public class SerialData : MonoBehaviour
{
    public  NetUrlData serialData;

    public static string cageCom;//罐笼com口

    private void Awake()
    {
        //GetDackstage();
        GetJson();
    }

    /// <summary>
    /// 后台获取
    /// </summary>
    public void GetDackstage()
    {

        HttpUtils.Instacne.GetSetting<NetUrlData>(Global.Instance.responseUserData.serial, Global.Instance.responseUserData.license, Global.Instance.enumEquip,
          (b1, s2, arg3) => {

              if (b1)
              {
                  serialData = arg3;
                  cageCom = serialData.Config.com3;
                  Debug.Log(cageCom);
              }
              else
              {

              }
          });
    }

    /// <summary>
    /// 获取ComJson数据
    /// </summary>
    public void GetJson() 
    {
        cageCom = LoadJson().com_9;
        Debug.Log(cageCom);
    }


    public JsonDate LoadJson() 
    {
        string path = Application.streamingAssetsPath + "/COM.json";
        return JsonConvert.DeserializeObject<JsonDate>(FileUtils.ReadFile(path));
    }
}

public class NetUrlData
{
    public URLSettingData Config;
}
public class URLSettingData
{
    public string com3;
}


public class JsonDate 
{
    public string com_9;
}

com口json配置表

{

  "com_9": "COM9"

}

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值