C# 串口多线程,在一段时间后应用程序崩溃

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,这与缓冲区大小有关吗?


1
首先,删除当前的 try/catch 块 - 使用 catch-all catch 块是不好的实践,这可能会隐藏您遇到问题的真正原因。 - Enigmativity
1个回答

1

使用while循环进行串口通信不是一个好的方式。你应该注册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);
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接