2017-04-07 107 views
-1

我正在尝试读取和写入串行端口,似乎我无法清除缓冲区。 我试过DiscardIn/Out方法无济于事。从串口发送的数据已经被应该被清除的缓冲区抵销。从串行端口读取时堆栈溢出

  public static SerialPort serialPort; 


      public static StringBuilder sendData { get { return sendData; } set { sendData = value;if (sendData.Equals("q")) quitEvent(); } } 

      static void Main(string[] args) 
      { 

       del ex = new del(StopThread); 

       serialPort = new SerialPort(); 
       serialPort.PortName = "COM3"; 
       serialPort.BaudRate = 9600; 
       serialPort.ReadTimeout = 2000; 
       _continue = true; 
       serialPort.Open(); 
       serialPort.DiscardInBuffer(); 
       serialPort.DiscardOutBuffer(); 

       Thread readthread = new Thread(ReadFromSerial); 
       Thread writethread = new Thread(WriteToSerial); 

       readthread.Start(); 
       writethread.Start(); 

       readthread.Join(); 
       writethread.Join(); 
       serialPort.Close(); 

       Console.ReadLine(); 

      }    

回答

0

您正在混淆具有常规属性的自动属性。正如所写,您的StringBuilder没有实际的sendData成员变量。你的sendData getter和setter只是递归地调用它们自己,最终导致堆栈溢出。

这将更好地工作:

private static StringBuilder _sendData; 
public static StringBuilder sendData { 
    get { return _sendData; } 
    set { 
     _sendData = value; 
     if (_sendData.Equals("q")) quitEvent(); 
    } 
} 

虽然能解决眼前的堆栈溢出的问题,但也有其他的问题(如你想创建的StringBuilder?为什么在测试对于Q setter?,你不会对Console.ReadLine()等做任何事情)。但我认为这些将是单独的问题。

+0

我的错误我纠正了autoproperty.Still事件没有触发。我的意思是我认为stringbuilder获取设置与他从串口收到的,但如果我按“q”它不会添加到收到的一行。 –