【Unity3D】串口通信

什么是串口呢

就是电脑的USB口,电脑和硬件间,通过USB,将数据传送到硬件

硬件也将数据通过USB线传送到电脑

从而完成电脑和硬件间的交互

串口表示

COM1 COM2 COM3等等

假如电脑中已经有了COM1,那插入一个新硬件时,就会自动成为COM2

(查看接入的串口 设备管理器->通用串行总线控制器)

当然,串口号是可以更改的,只要目标串口号没有被占用,就可以更改

(右键目标设备->属性->)

串口和端口的区别

串口是电脑与硬件的通信渠道

端口是软件与软件的通信渠道。

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);
        }
    }
}

猜你喜欢

转载自www.cnblogs.com/fws94/p/12296523.html