unity3d中串口的使用

Posted 个位数

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了unity3d中串口的使用相关的知识,希望对你有一定的参考价值。

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

关于串口的代码我在网上看了好多,一种是用事件来做,另外一种使用线程来做;

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

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。

 

以上是关于unity3d中串口的使用的主要内容,如果未能解决你的问题,请参考以下文章

Unity3D软硬件Unity3D与串口通信 SerialPort类完全教程

出售 unity3d串口插件

linux串口编程(termios)相关的使用问题

命令模式

Python readlines Api从串口访问时需要很长时间

unity3d游戏开发学习分享之表面着色器讲解