2017-11-04 5 views
1

Arduino를 사용하여 Unity에서 스마 트톱 시스템으로 작업하고 있습니다. PC와 arduino, android에 데이터를 전송하기 위해 포트와 네트워크를 작동하고 있습니다. SerialPort.ReadLine() 함수는 모든 것을 매우 지체시킵니다. 앱이 1 fps로 움직입니다. 코드는 다음과 같습니다.C# 직렬 포트 수신 데이터 이벤트

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 함수가 호출되지 않았습니까?

+0

다른 스레드에서'SerialPort.ReadLine'으로 읽으십시오. – Programmer

답변

1

업데이트() 동안 이벤트 핸들러를 한 번만 등록해야합니다. 업데이트는 일반적으로 프레임 당 한 번 호출되며 일반적으로 초당 30 회입니다.

속도가 느린 이유는 이제 단 한 번이 아닌 직렬 포트에서 많은 양의 호출이 이루어 지므로 낮은 프레임 속도입니다.

하드웨어 프로토콜을 사용하려는 경우 읽기 차단이 아닌 비동기 읽기를 사용하십시오. 블로킹 읽기가 목적을 다소 상쇄합니다. 비동기 읽기는 프레임 속도에서도 더 좋습니다.

+0

감사합니다. 비동기를 사용하는 방법? 기능이 있습니까? – user193464

+0

@ user193464 https://stackoverflow.com/a/32436104/585968을 확인하고'ReadAsync' 또는'BeginRead'를 사용하십시오. 마지막으로 Unity가'async/await'을 지원하지 않는다고 확인 했으므로'BeginRead'를 사용해야 할 수도 있습니다. – MickyD