从serialport读取值

时间:2016-06-01 14:19:29

标签: c# unity3d

我正在努力制作一个统一程序,从serialport读取值,我的程序冻结serial.ReadLine(),如果我将其更改为serial.ReadByte()它会读取字节,现在只有我想要的选项知道如何将这些字节转换为字符串。 我的代码如下:

using UnityEngine;
using System.Collections;
using System.IO.Ports;
using System;
using System.Threading;
using UnityEngine.UI;

public class leti3 : MonoBehaviour {

    public SerialPort serial = new SerialPort("COM5", 115200);
    public GameObject personaje;

    // Use this for initialization
    void Start()
    {
        serial.Open();
        //serial.ReadTimeout = 1;
    }

    // Update is called once per frame
    void Update()
    {
        if (serial.IsOpen)
        {
            try
            {
            print(serial.ReadByte()); //reads bytes
            }
            catch (System.Exception)
            {
                Debug.Log("Error!");
            }
        }
    }
}

1 个答案:

答案 0 :(得分:4)

ReadLine正在阻止。它将阻止执行,直到它到达行尾。您希望改为使用DataRecieved事件。

在处理程序中,您可以使用ReadExisting来获取当前缓冲区中的字符串。您必须管理该字符串可能只是您收到的消息的一部分。

或者您可以将字节读入数组,然后使用Encoding.GetString和适当的编码。

如果您无法使用DataRecieved并且必须使用屏蔽ReadByte,那么您应该仍然可以在更新中执行以下操作:

var toRead = serial.BytesToRead();    // make sure there actually are bytes to read first
for (int i=0; i < toRead; i++)
{
    // where msgArray is an array for storing the incoming bytes
    // and idx is the current idx in that array
    msgArray[idx] = serial.ReadByte();  // this should be quick, because it's already 
                                        // in the buffer
    if (msgArray[idx] = newLineChar)    // whatever newLineChar you are using
    {
        // Read your string
        var msg = Encoding.ASCII.GetString(msgArray,0,idx);   // or whatever encoding you 
                                                              // are using
        idx = 0;
    }
    else
    {
       idx++;
    }
}