unity串口通信

这篇具有很好参考价值的文章主要介绍了unity串口通信。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

   同学们好 本次教程带来unity的端口通信!

     端口一般需要接入外设,比如arduino等单片机,通过端口像电脑传输数据。而unity想要获取硬件信息就要读取端口里的数据。

    点开设备管理器可以看到当前连接的所有设备,也可以查看端口。我们一台电脑有多个端口,所以我们需要确定读取的是哪个端口。

本次教程涉及的软件 脚本均可在会员库- 公众号链接 - 端口 文件夹里获取!

unity 串口通讯,unity,游戏引擎

加入会员即可免费下载并可永久免费更新公众号教程资源(关注公众号 小森游戏制作  获取会员)

unity 串口通讯,unity,游戏引擎

     我们需要先下载端口调试的工具 ,网上很多这里老师用的是德飞莱串口

unity 串口通讯,unity,游戏引擎

unity 串口通讯,unity,游戏引擎

可以看到我们如果要读取端口数据 需要指定端口号,波特率,校验位,数据位和停止位。新建脚本 定义这些变量:

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

并且定义一个serialport(需要引入IO.Port类库)

   SerialPort sp = null;

然后初始化

   /// <summary>    /// 初始化    /// </summary>    /// <param name="port"></param>    public void InitPort(string port)    {        portName = port;        OpenPort();       // StartCoroutine(DataReceiveFunction1());        dataReceiveThread = new Thread(new ThreadStart(DataReceiveFunction));        dataReceiveThread.Start();    }

如果你不知道目标端口 可以遍历获取 并且链接闲置的(这里默认第一个)

   /// <summary>    /// 检索端口    /// </summary>    public void SearchPort()    {        List<string> ports = new List<string>();        bool con = false;        for (int i = 0; i < 5; i++)        {            try            {                SerialPort spa = new SerialPort("COM" + (i + 1));                spa.Open();                spa.Close();                ports.Add("COM" + (i + 1));                Debug.Log("COM" + (i + 1));                con = true;            }            catch (System.Exception)            {                continue;            }        }        Debug.Log(ports[0]);        if (con)            InitPort(ports[0]);    }

消息接收(这里定义了队列来存储消息 外部需要访问数据只需要队列出列就行)

     public Queue<string> msgs = new Queue<string>();//消息队列   void DataReceiveFunction()    {        #region         byte[] buffer = new byte[1024];        int bytes = 0;        while (true)        {            if (sp != null && sp.IsOpen)            {                try                {                    bytes = sp.Read(buffer, 0, buffer.Length);//接收字节                     Debug.Log(bytes);                    if (bytes == 0)                    {                        continue;                    }                    else                    {                        byte[] readdata = new byte[bytes];                        Array.Copy(buffer, 0, readdata,0, bytes);                        //string Utf8str = Encoding.UTF8.GetString(readdata);                       // string ASCIIstr = Encoding.ASCII.GetString(readdata);                        string Defaultstr = Encoding.Default.GetString(readdata);                        //string Unicodestr = Encoding.Unicode.GetString(readdata);                       // Debug.Log("Unicodestr:" + Unicodestr);                        Debug.Log("Defaultstr:" + Defaultstr);                       // Debug.Log("ASCIIstr:" + ASCIIstr);                       // Debug.Log("Utf8str:" + Utf8str);                    }                }                catch (Exception ex)                {                }            }            Thread.Sleep(100);        }        #endregion    }    #endregion

写入数据

    public void WriteData(string dataStr)    {        if (sp.IsOpen)        {            sp.Write(dataStr);        }    }

那么到这里我们的脚本就做好了 挂载到空物体上既可以进行测试,。

如果我们没有实际硬件 那么就需要一个虚拟化工具来开启虚拟端口,这里小森老师用的是这个configurevirtualseralportdriver

unity 串口通讯,unity,游戏引擎

该软件试用版可试用14天 如需破解只需要解压破解包吧下图的exe dll 替换掉安装位置的exe和dll(左侧拖到右侧替换)

unity 串口通讯,unity,游戏引擎

打开之后是这样

unity 串口通讯,unity,游戏引擎

我们点击添加端口就会添加一对 注意是一对 因为虚拟的或者实际的端口只能同时被一个进程访问 所以我们如果用一个端口就会只能收不能发 或者只能发不能收,所以这里添加的一对 我们其中一个用来发 另外一个用来接收即可。

比如我串口工具绑定com1 那么unity软件程序读取就绑定com2,然后运行unity 用工具向端口1发送数据 在unity端即可接收到消息:

unity 串口通讯,unity,游戏引擎

不过需要注意的是 有时候数据会被拆开 所以建议大家发送的时候加上数据长度 解析的时候进行存储 到指定长度之后拼接处理

对接收修改如下:

   public Queue<string> msgs = new Queue<string>();    StringBuilder sb = new StringBuilder();    int length = -1;    void DataReceiveFunction()    {        #region         byte[] buffer = new byte[1024];        int bytes = 0;        while (true)        {            if (sp != null && sp.IsOpen)            {                try                {                    bytes = sp.Read(buffer, 0, buffer.Length);//接收字节                     Debug.Log(bytes);                    if (bytes == 0)                    {                        continue;                    }                    else                    {                        byte[] readdata = new byte[bytes];                        Array.Copy(buffer, 0, readdata,0, bytes);                        //string Utf8str = Encoding.UTF8.GetString(readdata);                       // string ASCIIstr = Encoding.ASCII.GetString(readdata);                        string Defaultstr = Encoding.Default.GetString(readdata);                        //string Unicodestr = Encoding.Unicode.GetString(readdata);                        if(length < 0)                        {                            length = int.Parse(Defaultstr[0].ToString ());                            for (int i = 1; i < Defaultstr .Length ; i++)                            {                                sb.Append(Defaultstr[i]);                            }                        }else                        {                            for (int i = 0; i < Defaultstr.Length; i++)                            {                                sb.Append(Defaultstr[i]);                            }                        }                        if(sb .Length == length)                        {                            Debug.Log("数据:" + sb.ToString());                            msgs.Enqueue(sb.ToString());                            sb.Clear();                            length = -1;                        }                                           }                }                catch (Exception ex)                {                }            }            Thread.Sleep(100);        }        #endregion    }

效果如下:不管有没有分开 数据都是正常接收处理了

unity 串口通讯,unity,游戏引擎

好了 如上即为端口通信的全部内容,希望对同学们有所帮助!

期待你的点赞 关注 收藏!!!文章来源地址https://www.toymoban.com/news/detail-759495.html

到了这里,关于unity串口通信的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Unity Arduino 串口通信

    一、 Unity 端 发送消息 , Arduino 端 接收消息 通过 串口通信 Arduino端 Unity端 实现串口通信,点击开灯按钮,灯亮。关灯按钮,灯灭。 二、 Unity 端 接收消息 , Arduino 端 发送消息 通过 串口通信 Arduino端 Unity端 1.导入 Ardity 插件(在Unity商城中找) 2.打开读写实例场景  3.添加读

    2024年02月12日
    浏览(23)
  • 十八、Unity游戏引擎入门

    1、下载     首先需要下载Unity Hub,下载网址:https://unity.com/cn。     然后在其中下载Unity编辑器并安装,可选择最新版本。     接着需要选择适合的开发环境,例如Android Studio或Xcode,以便进行手机游戏开发。在安装完Unity后,需要根据项目需求下载对应的模块和插件,例

    2024年02月16日
    浏览(51)
  • Unity串口通信、接受和发送数据、C#

    串行接口(串口)通常指COM接口,是采用串行通信方式的扩展接口。串口按位(bit)发送和接收字节。尽管比按字节(byte)的并行通信慢,但是串口可以在使用一根线发送数据的同时用另一根线接收数据。特别适用于远距离通信。 查看串口:右键 我的电脑-管理-设备管理器

    2023年04月13日
    浏览(34)
  • Unity从零开始制作多人回合制对战游戏(1)——网络通讯

    考虑到我们的教程是网络游戏,所以还是得先写个服务器,本篇教程会向你科普什么是网络通讯、实现网络通讯需要的工具protobuf及其使用方法,最后,其主要内容是教你运用这些知识来开发一个使用c#作为后端的服务器,并完成通讯功能 新建一个unity项目作为客户端和c#控制

    2024年02月04日
    浏览(45)
  • 使用团结引擎开发Unity 3D射击游戏

           本案例是初级案例,意在引导想使用unity的初级开发者能较快的入门,体验unity开发的方便性和简易性能。       本次我们将使用团结引擎进行开发,帮助想体验团结引擎的入门开发者进行较快的环境熟悉。      本游戏是一个俯视角度的射击游戏。主角始终位于屏幕

    2024年01月19日
    浏览(52)
  • Unity、UE、Cocos游戏开发引擎的区别

    Unity、Unreal Engine(UE)和Cocos引擎是三个常用的游戏开发引擎,它们在功能和特性上有一些区别。以下是它们之间的主要区别: 编程语言:Unity使用C#作为主要的编程语言,开发者可以使用C#脚本进行游戏逻辑编写。Unreal Engine主要使用C++作为编程语言,但也支持蓝图系统,允许

    2024年02月22日
    浏览(47)
  • 30分钟了解所有引擎组件,132个Unity 游戏引擎组件速通!【收藏 == 学会】

    🎬 博客主页:https://xiaoy.blog.csdn.net 🎥 本文由 呆呆敲代码的小Y 原创,首发于 CSDN 🙉 🎄 学习专栏推荐:Unity系统学习专栏 🌲 游戏制作专栏推荐:游戏制作 🌲Unity实战100例专栏推荐:Unity 实战100例 教程 🏅 欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正! 📆 未来很长

    2024年02月11日
    浏览(52)
  • Unity vs Godot :哪个游戏引擎更适合你?

    游戏引擎的选择对开发过程和最终产品质量有着重大影响。近年来,Godot和Unity这两款引擎受到广泛关注。本文将从多个维度对两者进行比较,以期为开发者提供正确的选择建议。 Godot和Unity都有各自的优势,没有绝对的好坏之分。Godot开源免费,上手简单,更适合2D和小型游戏

    2024年01月23日
    浏览(74)
  • Unity Physics2D 2d物理引擎游戏 笔记

    2d 材质 里面可以设置 摩擦力 和 弹力 Simulated:是否在当前的物理环境中模拟,取消勾选该框类似于Disable Rigidbody,但使用这个参数更加高效,因为Disable会销毁内部产生的GameObject,而取消勾选Simulated只是禁用。 Kinematic 动力学刚体 动力学刚体不受重力和力的影响,而受用户的

    2023年04月24日
    浏览(102)
  • Unity和UE4两大游戏引擎,你该如何选择?

    目录 游戏引擎 2 —— 难易区别 编程语言 3 —— 游戏产品 UE4制作的游戏产品  Unity制作的游戏产品  产品类型 5 —— 资源商店 6 —— 人才需求 平均薪资 总结      Unity和UE4都是游戏引擎,所谓游戏引擎就是集成了复杂功能的游戏开发软件,他们帮我们实现了复杂的底层逻

    2023年04月08日
    浏览(53)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包