我正在编写用于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”而不是在一般情况下继续?
答案 0 :(得分:0)
是否会抛出异常?你发了足够的东西吗? read()
可能会阻止,直到您没有读取count
位。
因为SerialPort类缓冲数据,并且BaseStream属性中包含的流没有,所以两者可能会争用可读取的字节数。 BytesToRead属性可以指示有要读取的字节,但BaseStream属性中包含的流可能无法访问这些字节,因为它们已缓冲到SerialPort类。
当读取的字节数等于count但读串口上仍有未读字节时,Read方法不会阻止其他操作。