博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
unity3d中串口的使用
阅读量:5103 次
发布时间:2019-06-13

本文共 2930 字,大约阅读时间需要 9 分钟。

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

关于串口的代码我在网上看了好多,一种是用事件来做,另外一种使用线程来做;(经过试验,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     ///  28     /// 初始化串口 29     ///  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     ///  47     /// 接收处理串口字符串,将字符串转换为标准形式 48     ///  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     ///  95     /// 做什么东西 96     ///  97     private void DoSomething() 98     { 99         CheckData();100     }101 102     /// 103     /// 检查数据是否符合规则104     /// 105     /// 
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

你可能感兴趣的文章
mysql忘记密码时如何修改root用户密码
查看>>
STM32单片机使用注意事项
查看>>
在linux中出现there are stopped jobs 的解决方法
查看>>
获取浏览器版本信息
查看>>
SQLServer之删除视图
查看>>
js forEach跳出循环
查看>>
MyBatis---动态SQL
查看>>
快速创建一个 spring mvc 示例
查看>>
swing入门教程
查看>>
好莱坞十大导演排名及其代表作,你看过多少?
查看>>
JVM-class文件完全解析-类索引,父类索引和索引集合
查看>>
Loj #139
查看>>
StringBuffer是字符串缓冲区
查看>>
hihocoder1187 Divisors
查看>>
java入门
查看>>
Spring 整合 Redis
查看>>
Azure 托管镜像和非托管镜像对比
查看>>
SQLite3初探
查看>>
多线程/多进程/异步IO
查看>>
leetcode 442. 数组中重复的数据 java
查看>>