【Unity】Unity读取Arduino串口再通过UDP发送

该博客介绍了一个Unity3D项目,该项目通过Arduino板进行串口通信,实现设备的远程控制。在Unity中,使用C#脚本来设置串口参数并监听串口数据,接收到特定字符串时触发相应操作,如启动倒计时或发送UDP数据。同时,通过UDP客户端类发送和接收数据,实现与服务器的通信。整个系统旨在实现设备状态的实时反馈和远程控制。
摘要由CSDN通过智能技术生成

接收串口

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

using System.IO.Ports;
using System;
using System.Threading;
using System.Text;
using UnityEngine.UI;


public class Arduino : MonoBehaviour
{
    

    [Header("串口名")] public string portName;
    [Header("波特率")] public int baudRate = 9600;
    [Header("效验位")] public Parity parity = Parity.None;
    [Header("数据位")] public int dataBits = 8;
    [Header("停止位")] public StopBits stopBits = StopBits.One;

    private SerialPort sp = null;
    private Thread receiveThread;  //用于接收消息的线程

    private byte[] datasBytes;
    int i = 0;
    private string OneString;
    private string OtherString;
    public String strRec;
    public bool isRec = false;


    private void Awake()
    {      
        Screen.fullScreen = false;       
    }
    void Start()
    {
       
        //从配置文件获取串口名称
        portName = IniReadInfo.instance.SerialPort;

        switch (GetArduinoBoardPort(portName))
        {
            case "COM1":
                OpenPort();
                break;
            case "COM2":
                OpenPort();
                break;
            case "COM3":
                OpenPort();
                break;
            case "COM4":
                OpenPort();
                break;
            case "COM5":
                OpenPort();
                break;
           case "COM6":
                OpenPort();
                break;
            case "COM7":
                OpenPort();
                break;
            default:
                break;
        }
    }
    

    void Update()
    {
        if (OneString == "1" && isRec == false)
        {
            isRec = true;
            InvokeRepeating("CountDown", 1, 1);
           
             UDPClient.instacne.SocketSend("0");
        }
        if (OneString == "0" && isRec == true)
        {
            CancelInvoke("CountDown");
            isRec = false;
            UDPClient.instacne.SocketSend("1");
        }

      //  switch (OneString)
      //  {
         //   case "1":
           //     Titletext.text = "装置已触发";
            //    break;
         //   case "0":
        //        Titletext.text = "装置未触发";
          //      break;
        //    default:
         //       break;
   //     }


        if (timer - countStartTime >= time)
        {   
            timer = 0;
            Debug.Log("五秒内摸了5次");
            CancelInvoke("CountDown");
            return;     
        }

    }

    void FixedUpdate()
    {
       
        //定期回收垃圾       

        if (Time.frameCount % 120 == 0)
        {
            System.GC.Collect();
        }

    }


    #region 创建串口,并打开串口
    public void OpenPort()
    {
        //创建串口
        sp = new SerialPort(portName, baudRate, parity, dataBits, stopBits);
        //  sp.ReadTimeout = 200;
        if (!sp.IsOpen)
        {
            sp.Open();
        }
        receiveThread = new Thread(ReceiveThreadfunction);
        receiveThread.IsBackground = true;
        receiveThread.Start();
    }
    #endregion
    #region 程序退出时关闭串口
    void OnApplicationQuit()
    {
        ClosePort();
    }

    public void ClosePort()
    {
        if (sp != null && sp.IsOpen)
        {
            //关闭串口
            sp.Close();
            //将串口从内存中释放
            sp.Dispose();
            //关闭线程
            receiveThread.Abort();
        }
    }
    #endregion

    /// <summary>
    /// 接收串口数据
    /// </summary>
    private void ReceiveThreadfunction()
    {
        int bytesToRead = 0;
        while (true)
        {
            if (this.sp != null && this.sp.IsOpen)
            {
                try
                {
                    datasBytes = new byte[1024];
                    bytesToRead = sp.Read(datasBytes, 0, datasBytes.Length);
                    if (bytesToRead == 0)
                    {
                        continue;
                    }
                    else
                    {
                        strRec = Encoding.UTF8.GetString(datasBytes);
                        i++;
                        if (i == 1)
                        {
                            OneString = strRec[0].ToString();
                        }
                        else if (i == 2)
                        {
                            OtherString = OneString + strRec;
                            i = 0;
                           

                         
                            Debug.Log(OneString);
                        }
                        // this.sp.DiscardInBuffer();
                    }
                    /* strRec = sp.ReadLine();      */      
                                                                          // Debug.Log("Receive From Serial: " + strRec);
                                                            // Debug.Log(strRec);
                }
                catch (Exception e)
                {
                    Debug.Log(e.Message);
                }
            }
            Thread.Sleep(100);
        }
    }

    private string GetArduinoBoardPort(string sArduinoBoardName)
    {
        string sArduinoBoardPort = "";

        // 遍历所有端口
        foreach (string item in SerialPort.GetPortNames())
        {
            if (item.Equals(sArduinoBoardName))
            {
                sArduinoBoardPort = item;
                Debug.Log("找到当前单片机连接的端口: " + item);
            }
        }
        return sArduinoBoardPort;
    }

    public float time = 2f; //倒计时总时间
    float countStartTime = 0f;
    int timer = 0;

    void CountDown()
    {
      //  isJishi = true;
        timer++;
    }
}

UDP发送

using UnityEngine;
using System.Collections;
using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;

public class UDPClient : MonoBehaviour
{
    public static UDPClient instacne;

    //服务端的消息
    public string recvStr;

    //要连接的服务端的Ip
    public  string UDPClientIP="";
    public int SeverIPPort;
   // string str = "1231456789";

    Socket socket;
    EndPoint serverEnd;
    IPEndPoint ipEnd;

    byte[] recvData = new byte[1024];
    byte[] sendData = new byte[1024];

    //消息长度
    int recvLen = 0;
    Thread connectThread;

    private void Awake()
    {
        instacne = this;
    }
    
    void Start()
    {
        //从配置文件里获取
        SeverIPPort=IniReadInfo.instance.ServerPort;

        //从配置文件取地址 
        UDPClientIP = IniReadInfo.instance.ServerAdressIP;

        UDPClientIP = UDPClientIP.Trim();

        InitSocket();
    }

    void InitSocket()
    {
        ipEnd = new IPEndPoint(IPAddress.Parse(UDPClientIP), SeverIPPort);
        socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
        IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0);
        serverEnd = (EndPoint)sender;
        print("等待连接");
       SocketSend("666");
        print("连接");
        //开启一个线程连接
     //   connectThread = new Thread(new ThreadStart(SocketReceive));
      //  connectThread.Start();
    }
    public void SocketSend(string sendStr)
    {
        //清空
        sendData = new byte[1024];
        //数据转换
        sendData = Encoding.UTF8.GetBytes(sendStr);
        //发送给指定服务端
        socket.SendTo(sendData, sendData.Length, SocketFlags.None, ipEnd);
      //  PhotoBoothController.instance.SendMessages = true;

        //sendData = Encoding.UTF8.GetBytes("S");
        发送给指定服务端
        //socket.SendTo(sendData, sendData.Length, SocketFlags.None, ipEnd);

        //  SendMessages = false;
    }

    //接收服务器信息
    void SocketReceive()
    {
        while (true)
        {

            recvData = new byte[1024];
            try
            {
                recvLen = socket.ReceiveFrom(recvData, ref serverEnd);
            }
            catch (Exception e)
            {
            }

            //  print("信息来自: " + serverEnd.ToString());
            if (recvLen > 0)
            {
                recvStr = Encoding.UTF8.GetString(recvData, 0, recvLen);
                Debug.Log("得到服务端的消息:" + recvStr);
            }

            //  print(recvStr);
        }
    }

    //连接关闭
    void SocketQuit()
    {
        //关闭线程
        if (connectThread != null)
        {
            connectThread.Interrupt();
            connectThread.Abort();
        }
        //最后关闭socket
        if (socket != null)
            socket.Close();
    }
    void OnApplicationQuit()
    {
        SocketQuit();
    }



}
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值