线程不读

时间:2014-11-25 09:22:26

标签: c# linux multithreading unity3d serial-port

我正在编写用于Unity3D的C#代码,以便从串口读取。这是用另一个线程完成的。读取线程在调用SerialPort.Read方法时挂起。阅读线程类如下:

public class Serial_Port_Reader {
    private SerialPort port;
    private byte[] data;
    private int bytes;

    public Serial_Port_Reader(SerialPort in_port, int in_bytes) {
        port = in_port;
        bytes = in_bytes;
        data = new byte[bytes];
    }
    public void read() {
        try {
            while(true) {
                IO.log.Add("A");
                data = new byte[bytes];
                IO.log.Add("C");
                port.Read(data, 0, 1);
                IO.log.Add("Data Received: "+DateTime.Now.ToString());
                Data.parse(data);
                IO.log.Add("D");
                port.DiscardInBuffer();
            }
        }
        catch(ThreadAbortException e) {IO.log.Add("Abort:"+e.Message);}
        catch(IOException e) {IO.log.Add("IO:"+e.Message);}
        catch(Exception e) {IO.log.Add(e.Message);}
        finally {if(port.IsOpen) port.Close();}
    }
}

它被称为:

workaround = new Serial_Port_Reader(input, Data.bytes);
reader = new Thread(new ThreadStart(workaround.read));
reader.Start();

如果线程已经处于活动状态,它将在“C”处停止,即使我发送数据也会保持不变。如果我在接收数据的过程中启动线程,它将按预期工作(即它将读取一个字符),然后在下一个循环中停止在“C”。

我试图让它继续读取数据。为什么它停在“C”而不是在一般情况下继续?

1 个答案:

答案 0 :(得分:0)

是否会抛出异常?你发了足够的东西吗? read()可能会阻止,直到您没有读取count位。

msdn:

  

因为SerialPort类缓冲数据,并且BaseStream属性中包含的流没有,所以两者可能会争用可读取的字节数。 BytesToRead属性可以指示有要读取的字节,但BaseStream属性中包含的流可能无法访问这些字节,因为它们已缓冲到SerialPort类。

     

当读取的字节数等于count但读串口上仍有未读字节时,Read方法不会阻止其他操作。