求大神告诉萌新 哪里有问题,怎么解决呢。。

using System;
using System.Collections.Generic;
using System.IO.Ports;
using System.Linq;
using System.Text;
using System.Threading;
using System.Windows.Forms;

namespace VNABLL
{
public class Comm
{
public delegate void EventHandle(string readBuffer);
public event EventHandle DataReceived;

    private SerialPort serialPort;
    Thread thread;
    volatile bool _keepReading;

    public Comm()
    {
        if (serialPort == null)
        {
            serialPort = new SerialPort("COM3", 9600);
            this.serialPort.DiscardNull = true;
            this.serialPort.ReadTimeout = 10;
            this.serialPort.DataReceived += new SerialDataReceivedEventHandler(serialPort_DataReceived);

        }
        thread = null;
        _keepReading = false;

    }

    public bool IsOpen
    {
        get
        {
            return serialPort.IsOpen;
        }
    }

    private void StartReading()
    {
        if (!_keepReading)
        {
            _keepReading = true;
            thread = new Thread(new ThreadStart(ReOpen));
            thread.Start();
        }
    }

    private void StopReading()
    {
        if (_keepReading)
        {
            _keepReading = false;
            thread.Join();
            thread = null;
        }
    }

    readonly object obj = new object();
    public void Open()
    {
        Close();
        serialPort.Open();
        if (serialPort.IsOpen)
        {
            StartReading();
        }
        else
        {
            MessageBox.Show("串口打开失败!");
        }
    }

    public void Close()
    {
        StopReading();
        serialPort.Close();
    }

    public bool WritePort(string sendMsg)
    {
        bool flag = false;
        try
        {
            if (serialPort.IsOpen)
            {
                serialPort.Write(sendMsg);
                flag = true;
            }
            else
            {
                flag = false;
            }
        }
        catch
        {
            flag = false;
        }
        return flag;
    }

    string str = "";
    private void serialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
    {
        if (serialPort.IsOpen)
        {
            System.Threading.Thread.Sleep(300);
            int count = serialPort.BytesToRead;
            if (count > 0)
            {

                byte[] readBuffer = new byte[count];
                try
                {
                    serialPort.Read(readBuffer, 0, count);
                    if (string.IsNullOrEmpty(str))
                        str = System.Text.Encoding.Default.GetString(readBuffer);
                    else
                        str += System.Text.Encoding.Default.GetString(readBuffer);                      


                    if (str.Contains("@XJ1") && str.Contains("#"))
                    {

                        if (DataReceived != null)
                            DataReceived(str);
                        str = "";
                        serialPort.DiscardInBuffer();
                    }

                    if (str.Contains("@HJ1") && str.Contains("#"))
                    {

                        if (DataReceived != null)
                            DataReceived(DecodeFire(readBuffer));
                        str = "";
                        serialPort.DiscardInBuffer();
                    }


                     string DecodeFire(byte[] fetchbyte)
                    {
                        string head = str.Substring(0, 4);
                        string end = str.Substring(29, 1);
                        int x = (int)fetchbyte[4];
                        string[] decs = new string[24];

                        for (int i = 5; i < fetchbyte.Length - 1; i++)
                        {
                            int deci = (int)fetchbyte[i] - x + 9;
                            //Array.Copy(System.Text.ASCIIEncoding.Default.GetBytes(deci.ToString()), 0, Bufferx, 0, 1);
                            //decs[i-5] = System.Text.Encoding.ASCII.GetString(Bufferx);
                            decs[i - 5] = deci.ToString();

                        }

                        string sr = String.Join("", decs);
                        string declast = head + sr + end;
                        return declast;
                    }
                }

                catch (TimeoutException)
                {
                }
            }
        }
    }




    private void ReOpen()
    {
        while (_keepReading)
        {
            Close();
            serialPort.Open();
        }
 }
}

}