工作中遇到了串口的问题,通过查资料&实验写出了下面代码;

关于串口的代码我在网上看了好多,一种是用事件来做,另外一种使用线程来做;(经过试验,unity无法用串口自带的事件进行数据读取);

看完以后,个人感觉比较麻烦,所以就用了下面的方式;

PS:也可以改成用IEnumerator 或者Invoke来写

  1 using UnityEngine;
  2 using System.Collections;
  3 using System.IO.Ports;
  4 using System;
  5 using System.Text;
  6
  7 public class ProtTest : MonoBehaviour
  8 {
  9     //串口
 10     private SerialPort port = new SerialPort();
 11     //用于读取缓存区数据
 12     private byte[] readBuffer;
 13     //缓存byte转化的string
 14     private string byteConvertSave;
 15     //缓存没有用过的数据
 16     private string portDataSave = "";
 17     //缓存依照约定拆解的字符串
 18     private string[] portDataSplit;
 19     //缓存有效数据
 20     private string validData = "";
 21
 22     private void Awake()
 23     {
 24         InitProp();
 25     }
 26
 27     /// <summary>
 28     /// 初始化串口
 29     /// </summary>
 30     private void InitProp()
 31     {
 32         port.PortName = "COM3";
 33         port.BaudRate = 9600;
 34         port.Parity = Parity.None;
 35         port.DataBits = 8;
 36         port.StopBits = StopBits.One;
 37         port.Open();
 38     }
 39
 40     void Update()
 41     {
 42         HandleProtData();
 43         DoSomething();
 44     }
 45
 46     /// <summary>
 47     /// 接收处理串口字符串,将字符串转换为标准形式
 48     /// </summary>
 49     private void HandleProtData()
 50     {
 51         if (!port.IsOpen)
 52         {
 53             return;
 54         }
 55
 56         //读取串口数据
 57         readBuffer = new byte[port.ReadBufferSize];
 58         try
 59         {
 60             int count = port.Read(readBuffer, 0, port.ReadBufferSize);
 61             //转化成字符串
 62             byteConvertSave = Encoding.ASCII.GetString(readBuffer, 0, count);
 63             if (count != 0)
 64             {
 65                 //保存字符串
 66                 portDataSave += byteConvertSave;
 67             }
 68         }
 69         catch (TimeoutException)
 70         {
 71         }
 72
 73         //拆解字符串
 74         portDataSplit = portDataSave.Split('\n');//按照约定规则
 75
 76         /* 下面这样做是因为串口传过来的字符串不一定是完整的
 77          * 比如说,正常的数据是
 78          * 第一次传输a,b,c,d;
 79          * 第二次传输c,f,b,g;
 80          * 可能传过来的数据就变成了
 81          * 第一次传输a,b,c,d;c,f
 82          * 第二次传输,b,g;
 83         */
 84         if (portDataSplit.Length > 1)
 85         {
 86             //倒数第二个数据是有效数据,因为是完整的
 87             validData = portDataSplit[portDataSplit.Length - 2];
 88             //及时清除无用数据
 89             //将当前未使用的数据更新为倒数第一个数据
 90             portDataSave = portDataSplit[portDataSplit.Length - 1];
 91         }
 92     }
 93
 94     /// <summary>
 95     /// 做什么东西
 96     /// </summary>
 97     private void DoSomething()
 98     {
 99         CheckData();
100     }
101
102     /// <summary>
103     /// 检查数据是否符合规则
104     /// </summary>
105     /// <returns></returns>
106     private bool CheckData()
107     {
108         return false;
109     }
110 }

PS:最后说一下遇到的问题和解决方法:

问题:那就是找不到SerialProp这个类,当我引入using System.IO.Ports的时候,报错说找不到该命名空间。

解决方法:playersetting里面Api Compatibility Level 选择 .NET2.0而不是 .NET2.0 SubSet。

转载于:https://www.cnblogs.com/singledigit/p/5568871.html

unity3d中串口的使用相关推荐

  1. 【Unity3D软硬件】Unity3D与串口通信 SerialPort类完全教程

    推荐阅读 CSDN主页 GitHub开源地址 Unity3D插件分享 简书地址 我的个人博客 QQ群:1040082875 大家好,我是佛系工程师☆恬静的小魔龙☆,不定时更新Unity开发技巧,觉得有 ...

  2. Unity3D 中 2D_Toolkit插件下载 和 导入方法

    Unity3D 中 2D_Toolkit插件下载 和 导入方法 1.你把下载来的包放到 安装目录:Editor\Standard Packages里面. 2.然后按ctrl+9,进入asset sto ...

  3. Unity3D中暂停时的动画及粒子效果实现

    暂停是游戏中经常出现的功能,而Unity3D中对于暂停的处理并不是很理想.一般的做法是将Time.timeScale设置为0.Unity的文档中对于这种情况有以下描述: The scale at wh ...

  4. C# 中串口通信 serialport1.DataReceived 函数无法触发或者出发延时等等问题解决方法

    C# 中串口通信 serialport1.DataReceived 函数无法触发或者出发延时等等问题解决方法 参考文章: (1)C# 中串口通信 serialport1.DataReceived 函数 ...

  5. C#中串口通信编程 收藏

    C#中串口通信编程 收藏 本文将介绍如何在.NET平台下使用C#创建串口通信程序,.NET 2.0提供了串口通信的功能,其命名 空间是System.IO.Ports.这个新的框架不但可以访问计算机上的 ...

  6. Unity3D 中的程序后台运行

    Unity3D中程序后台运行,我原本认为当Application.runInBackground=false时,Socket保持连接,但是不接受数据,经过测试并非如此,当Application.run ...

  7. 工具设置Unity3D系列教程--使用免费工具在Unity3D中开发2D游戏 第一节

    时间紧张,先记一笔,后续优化与完善. 声明:   本博客文章翻译类别的均为个人翻译,版权全部.转载请注明出处: http://blog.csdn.net/ml3947,另外本人的个人博客:http:/ ...

  8. 求android 中串口的发送接收数据代码

    RT,求高手帮忙! 就是 /dev/ttyS0 和/dev/ttyS1 两个设备的通信问题.. 同求~ 这个是不是需要串口驱动啊?最近正在搞这个串口通信的案子,头疼 同样也没有搞出来,老是报:不能扫描 ...

  9. unity3d中让物体显示和隐藏

    unity3d中让物体显示和隐藏的方法 gameObject.renderer.enabled //是控制一个物体是否在屏幕上渲染或显示  而物体实际还是存在的 仅仅是想当于隐身 而物体本身的碰撞体还 ...

  10. Unity3d中BlinnPhong光照模型注解

    /* *     版本:0.1     最后修改:2012-08-10     撰写:李现民 Unity3D中主要用到的shader(着色器)有三种,除了常规的vertex shader与fragme ...

最新文章

  1. 复化梯形公式,Newton-Cotes公式,变量代换后的复化梯形公式,Gauss-Legendre公式,Gauss-Jacobi公式插值积分的精确度比较
  2. 第三十五课.基于贝叶斯的深度学习
  3. 配置IPsec Tunnel With TACACS+ User Authentication
  4. 马自达新车全面取消触摸屏,意外引得叫好声一片
  5. Mybatis一对一结果映射
  6. 产品经理经验谈100篇(一)-一个经销商订单贷的业务设计
  7. 排序算法Java实现(基数排序)
  8. 2019计算机国二操作题,2019年3月计算机二级C++操作练习题及答案(十二)
  9. 努力的钻研深层次的【飞鸽传书】技术
  10. java 调用 c# webservice 压缩 Liststring示例
  11. 防止各大网盘下载限速解决方案--idman
  12. 第八届山东省ACM大学生程序设计竞赛总结
  13. 社科院与杜兰大学金融管理硕士——在自己的领域努力拼搏,终将遇到专属的光芒
  14. h2o flow初探
  15. BTC钱包(wallet.dat 文件密码与私钥的区别)
  16. 定位的坑:class属性有空格
  17. 一维数组和二维数组的定义及用法
  18. [实用教程] 科普贴:SGLTE、SVLTE、CSFB、SRLTE
  19. 平阳县抖音平台直播运营主播带货第三期培训提升班开班啦!
  20. HNU程序设计-图书馆信息管理系统设计以及实验报告

热门文章

  1. pku3277 City Horizon.(离散化+二分查找)
  2. SQL中的集合运算有必要存在的几个例子
  3. Slider控件的使用方法
  4. ubuntu16.04中安装MESA 17.3.3
  5. 淺談auto_ptr
  6. 小波变换——哈尔小波,Haar
  7. FTP和SSH的区别
  8. win10安装kali组双系统
  9. VS2010中的sln,suo分别是什么含义
  10. 10-08 长假结束