我正在努力制作一个统一程序,从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!");
}
}
}
}
答案 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++;
}
}