2012-06-04 119 views
3

我正在写一个程序,从COM端口读取数据并显示在屏幕上。当数据读取频率较低时,它工作得很好,可以整天运行。但是,当数据每秒发送时,程序每30分钟崩溃一次。错误代码是c0000005访问冲突。C#串口线程,应用程序在一段时间后崩溃

 void Start() 
    { 
    _serialPort = new SerialPort(TempPortName, 9600, Parity.None, 8, StopBits.One);   
    _serialPort.Handshake = Handshake.None; 
    _serialPort.ReadTimeout = 1000; 
    _serialPort.ReadBufferSize = 100000; 
    readThread = new Thread(Read); 
    readThread.Start();   
    } 

void Read() 
    { 
    string MessageSection = ""; 
    char[] end = {'\r'};  

    //string MessageSection = ""; 
    while (readData) 
    {   
    Thread.Sleep(10); 
     if (_serialPort.IsOpen) 
     { 

      string message = "test"; 

     try 
       { 
        message = ((char)(_serialPort.ReadByte())).ToString(); 

       } 
       catch 
       { 
        message = ""; 
       } 

       if (message != "") 
       { 

        message = MessageSection + message; 

        string[] MessageArray = message.Split(end); 
        if (!message.EndsWith("\r")) 
        { 
         MessageSection = MessageArray[MessageArray.Length - 1];      
        } 
        else 
        { 
     if(message.Length>0) 
     { 
      doSomething(); 
     } 
         MessageSection = ""; 
        } 
       } 
     else { 
     } 

     } 
     else 
     { 
      try 
      { 
       _serialPort.Open(); 

      } 

      catch 
      { 
       print("Error"); 
      } 
     } 
    } 

    } 

我使用的是Unity 3D,是关于buffersize的吗?

+1

通过删除您当前的'try' /'catch'块开始了 - 它是用不好的做法,包罗万象的'catch'块,这些可能藏匿的你的问题的真正原因。 – Enigmativity

回答

1

使用while loop进行串行端口通信的方式并不合适。您正在注册SerialPort.DataReceived Event以接收端口上的数据。

下面是从MSDN

示例代码
using System; 
using System.IO.Ports; 

class PortDataReceived 
{ 
    public static void Main() 
    { 
     SerialPort mySerialPort = new SerialPort("COM1"); 

     mySerialPort.BaudRate = 9600; 
     mySerialPort.Parity = Parity.None; 
     mySerialPort.StopBits = StopBits.One; 
     mySerialPort.DataBits = 8; 
     mySerialPort.Handshake = Handshake.None; 

     mySerialPort.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler); 

     mySerialPort.Open(); 

     Console.WriteLine("Press any key to continue..."); 
     Console.WriteLine(); 
     Console.ReadKey(); 
     mySerialPort.Close(); 
    } 

    private static void DataReceivedHandler(
         object sender, 
         SerialDataReceivedEventArgs e) 
    { 
     SerialPort sp = (SerialPort)sender; 
     string indata = sp.ReadExisting(); 
     Console.WriteLine("Data Received:"); 
     Console.Write(indata); 
    } 
} 
相关问题