2012-06-04 6 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"); 
      } 
     } 
    } 

    } 

유니티 3D를 사용하고 있습니다. 버퍼링에 관한 것입니까?

+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); 
    } 
} 
관련 문제