3

COMポートからデータを読み込み、画面に表示するプログラムを書いています。データの読み取り頻度が低い場合、データは完全に正常に機能し、終日実行できます。ただし、データが毎秒送信されると、プログラムは 30 分ごとにクラッシュします。エラー コードは c0000005 アクセス違反です。

     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 を使用していますが、バッファサイズについてですか?

4

1 に答える 1

1

を使用してシリアルポート通信を行うのはまともな方法ではありませんwhile loop。ポートで着信データを受信するSerialPort.DataReceivedイベントを登録しています。

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);
    }
}
于 2012-06-04T04:44:07.557 に答える