工作中遇到了串口的问题,通过查资料&实验写出了下面代码;
关于串口的代码我在网上看了好多,一种是用事件来做,另外一种使用线程来做;(经过试验,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。