zoukankan      html  css  js  c++  java
  • 【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);
            }
        }
    }
  • 相关阅读:
    算法设计策略
    挖金矿
    寻找假币
    循环赛日程表
    【三分钟视频教程】iOS开发中 Xcode 报 apple-o linker 错误的#解决方案#
    iOS问题#解决方案#之关于“application/x-www-form-urlencoded;charset=utf-8” not supported
    【两分钟教程】如何为博客园添加QQ咨询效果
    【两分钟教程】如何更改Xcode项目名称
    iOS数据库操作之coredata详细操作步骤
    svn使用笔记
  • 原文地址:https://www.cnblogs.com/fws94/p/12296523.html
Copyright © 2011-2022 走看看