unity3d中串口的使用

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

关于串口的代码我在网上看了好多,一种是用事件来做,另外一种使用线程来做;(经过试验,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

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值