zoukankan      html  css  js  c++  java
  • 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('
    ');//按照约定规则
     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。

    
    
  • 相关阅读:
    PAT (Advanced Level) Practice 1054 The Dominant Color (20 分)
    PAT (Advanced Level) Practice 1005 Spell It Right (20 分) (switch)
    PAT (Advanced Level) Practice 1006 Sign In and Sign Out (25 分) (排序)
    hdu 5114 Collision
    hdu4365 Palindrome graph
    单链表查找最大值、两个递增的链表合并并且去重
    蓝桥杯-最短路 (SPFA算法学习)
    蓝桥杯-最大最小公倍数
    Codeforces-470 div2 C题
    蓝桥杯-地宫取宝
  • 原文地址:https://www.cnblogs.com/singledigit/p/5568871.html
Copyright © 2011-2022 走看看