C#Serial Port Recieved Data Event

时间:2017-11-04 23:29:05

标签: c# android unity3d serial-port port

我正在使用Arduino在Unity中使用智能家居系统。我正在使用端口和网络将数据从pc发送到arduino和android。函数SerialPort.ReadLine()使每个人都非常迟钝。它使应用程序以1 fps移动。 这是代码:

using UnityEngine;
using System;
using System.IO.Ports;

public class Motorase : MonoBehaviour {

    public SerialPort sp;

    bool deschis1, deschis2, deschis3, deschis4;

    public int temp, umid, gazv;

    // Use this for initialization
    void Start () {

        deschis1 = false;
        deschis2 = false;
        deschis3 = false;
        deschis4 = false;


        foreach (string port in SerialPort.GetPortNames())
            sp = new SerialPort(port, 9600);

        if(!sp.IsOpen)
            sp.Open();

        sp.DtrEnable = true;    // Data-terminal-ready
        sp.RtsEnable = true;    // Request-to-send
    }

    void Update()
    {
        sp.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);
    }

    void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e)
    {
        Debug.Log("Da");
        temp = Convert.ToInt32(sp.ReadLine());
        umid = Convert.ToInt32(sp.ReadLine());
        gazv = Convert.ToInt32(sp.ReadLine());
        int apro = Convert.ToInt32(sp.ReadLine());

    }

它出了什么问题?为什么函数DataReceivedHandler没有被调用?

1 个答案:

答案 0 :(得分:1)

您应该只在更新()期间注册一次事件处理程序,而不是多次。每帧调用一次,通常每秒30次。

速度慢的原因是,现在每帧有多次调用要从串口读取而不是只读一次,因此帧速率较低。

如果要使用硬件协议,则使用异步读取而不是阻止读取。阻止读取有点失败的目的。异步读取也适用于帧速率。