加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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数据的格式是

1,104,0.54437256,-0.2632141,9.826126

1,105,0.56111145,-0.279953,9.8524475

1,106,0.54556274,9.833298

1,107,0.5515442,-0.26081848,9.841675

1,108,0.5312042,-0.2644043,9.867996

这是一个连续的流,可能是使用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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读