c# – 从Android应用程序读取Unity中的串行数据
发布时间:2020-12-15 22:17:51 所属栏目:百科 来源:网络整理
导读:我正在使用 Android的 SensoDuino( Official website)应用程序使用蓝牙串行通信向PC中的Unity发送感应数据,如Accelerometer,gyro等.我在Unity中使用以下代码来接收数据 – using UnityEngine;using System.Collections;using System.IO.Ports;using System;p
我正在使用
Android的
SensoDuino(
Official website)应用程序使用蓝牙串行通信向PC中的Unity发送感应数据,如Accelerometer,gyro等.我在Unity中使用以下代码来接收数据 –
using UnityEngine; using System.Collections; using System.IO.Ports; using System; public class COM : MonoBehaviour { public SerialPort sp; public float data; void Start () { sp = new SerialPort("COM3",9600,Parity.None,8,StopBits.One); Debug.Log ("Connection started"); if (sp != null) { if (sp.IsOpen) { sp.Close(); Debug.Log ("Closing port,because it was already open!"); } else { sp.Open(); // opens the connection // sets the timeout value before reporting error sp.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler); Debug.Log("Port Opened!"); } } else { if (sp.IsOpen) { print("Port is already open"); } else { print("Port == null"); } } Debug.Log ("Open Connection finished running"); } void Update () { data = float.Parse( sp.ReadTo ("r") ) ; print ("data = " + data); } private void DataReceivedHandler(object sender,SerialDataReceivedEventArgs e) { SerialPort spl = (SerialPort)sender; data = float.Parse( spl.ReadTo ("r") ) ; Debug.Log(data.ToString()); print ("data = " + data); } } 但我无法接收任何数据. DataReceiveHandler根本没有触发.我也尝试使用ReadLine(),但它冻结了Unity. SensoDuino发送Accelerometer数据的格式是
这是一个连续的流,可能是使用ReadLine()时冻结的原因. 请帮我看看数据. 解决方法
我找到了解决方案. ReadLine()是一个阻塞调用,所以我不得不使用ReadByte()来连续读取字节并在以后转换数据.为了减少延迟,在一个线程中调用了ReadByte()函数.
void recData() { if ((sp != null) && (sp.IsOpen)) { byte tmp; string data = ""; string avalues=""; tmp = (byte) sp.ReadByte(); while(tmp !=255) { data+=((char)tmp); tmp = (byte) sp.ReadByte(); if((tmp=='>') && (data.Length > 30)){ avalues = data; parseValues(avalues); data=""; } } } } 我已经做了一个非常详细的教程here (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |