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。

    
    
  • 相关阅读:
    设计模式
    IPC- Posix与system v
    squashfs文件系统
    各种根文件系统
    SPI通讯协议
    tty各种设备的情况
    Linux系统调用过程
    uImage和zImage的区别
    jquery可见性选择器(匹配匹配所有显示的元素)
    jquery可见性选择器(匹配所有隐藏的元素)
  • 原文地址:https://www.cnblogs.com/singledigit/p/5568871.html
Copyright © 2011-2022 走看看