【Unity3D】串口通信


什么是串口呢

就是電腦的USB口,電腦和硬件間,通過USB,將數據傳送到硬件

硬件也將數據通過USB線傳送到電腦

從而完成電腦和硬件間的交互

 

串口表示

COM1 COM2 COM3等等

假如電腦中已經有了COM1,那插入一個新硬件時,就會自動成為COM2

(查看接入的串口 設備管理器->通用串行總線控制器)

當然,串口號是可以更改的,只要目標串口號沒有被占用,就可以更改

(右鍵目標設備->屬性->端口設置->高級->COM端口號(P))

 

串口和端口的區別

串口是電腦與硬件的通信渠道

端口是軟件與軟件的通信渠道。

IP定位到電腦,在IP后面跟上端口號,定位到該電腦的軟件

如127.0.0.1:80

換一個端口號,連接的便是另一個軟件了

串口通過串口號定位到硬件設備

更改串口號便更改了通信的硬件設備

 

串口通常用來做什么呢

軟件通過串口,向硬件發送信息

如:軟件發送信息給單片機,單片機接收到信息后控制燈帶的變化

在Unity領域,一般是通過串口接受雷達的事件,從而完成體感交互的程序

不過雷達串口是不用手寫的

而一些控制硬件交互的程序,是需要手寫的串口通信的

 

串口通信是怎么通訊的呢

串口通信支持多種數據類型

如byte[],string

有了string,便可以傳遞json串,也就可以傳遞任何數據了

 

Unity怎么寫串口通信呢

.net提供了相關的類,寫起來也是相當方便的

這個類是Serialport

需要引入庫:using System.IO.Ports;

 

注意事項

1.將Unity3D的切換成Api Compatibility Level改為 NET2.0(高版本Unity為.Net 4.x),否則Unity編寫SerialPort類會報錯

2.串口返回來的數據,不是在主線程的,所一需要將這些數據存儲在一個隊列中,然后在Update中檢測隊列中的數據

 

接下來,直接用下面代碼的回調就可以了

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

public class SerialPortManager : MonoBehaviour
{
    public string portName = "COM4";//串口號
    public int baudRate = 9600;//波特率
    public Parity parity = Parity.None;//效驗位
    public int dataBits = 8;//數據位
    public StopBits stopBits = StopBits.One;//停止位
    SerialPort sp = null;
    Thread dataReceiveThread;
    public List<byte> listReceive = new List<byte>();
    char[] strchar = new char[100];//接收的字符信息轉換為字符數組信息
    string str;
   
    void Start()
    {
        OpenPort();
        dataReceiveThread = new Thread(new ThreadStart(DataReceiveFunction));
        dataReceiveThread.Start();
    }
    public void OpenPort()
    {
        //創建串口
        sp = new SerialPort(portName, baudRate, parity, dataBits, stopBits);
        sp.ReadTimeout = 400;
        try
        {
            sp.Open();
        }
        catch (Exception ex)
        {
            Debug.Log(ex.Message);
        }
    }

    void OnApplicationQuit()
    {
        ClosePort();
    }

    public void ClosePort()
    {
        try
        {
            sp.Close();
            dataReceiveThread.Abort();
        }
        catch (Exception ex)
        {
            Debug.Log(ex.Message);
        }
    }

    private void Update()
    {
        PrintData();
    }

    //打印數據
    void PrintData()
    {
        for (int i = 0; i < listReceive.Count; i++)
        {
            strchar[i] = (char)(listReceive[i]);
            str = new string(strchar);
        }
        Debug.Log(str);
    }

    //接收數據
    void DataReceiveFunction()
    {
        byte[] buffer = new byte[1024];
        int bytes = 0;
        while (true)
        {
            if (sp != null && sp.IsOpen)
            {
                try
                {
                    bytes = sp.Read(buffer, 0, buffer.Length);//接收字節
                    if (bytes == 0)
                    {
                        continue;
                    }
                    else
                    {
                        string strbytes = Encoding.Default.GetString(buffer);
              //接受的數據
                        Debug.Log(strbytes);
                    }
                }
                catch (Exception ex)
                {
                    if (ex.GetType() != typeof(ThreadAbortException))
                    {
                    }
                }
            }
            Thread.Sleep(10);
        }
    }

  //發送數據
    public void WriteData(string dataStr)
    {
        if (sp.IsOpen)
        {
            sp.Write(dataStr);
        }
    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM