namespace scommReceiver.ClsTemplate
{
    public delegate void SetStringOnMainEventHandler(String msg);
    class ShareData
    {
        private static Queue shareQuene= new Queue();
        public event SetStringOnMainEventHandler SetStringOnboard;
        public  void DealData()
        {
            while (true)
            {
                if (shareQuene.Count > 0)
                {
                    byte[] data = (byte[])shareQuene.Dequeue();
                    String rt = System.Text.Encoding.Default.GetString(data);                    
                    SetStringOnboard(rt);
                    rt = null;
                }
                Thread.Sleep(10);
            }
        }
              public static void setShareQuene(byte[] data)
        {
            Monitor.Enter(shareQuene);
            shareQuene.Enqueue(data);
            Monitor.Exit(shareQuene);
        }
    }
}namespace scommReceiver
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        ShareData sd = new ShareData();
        public delegate void setMsg(string msg);
        private void Form1_Load(object sender, EventArgs e)
        {
            Microsoft.VisualBasic.Devices.Computer pc = new Microsoft.VisualBasic.Devices.Computer();
            foreach( string s in pc.Ports.SerialPortNames ){
                this.cbCom.Items.Add(s);
                this.cbCom.SelectedIndex = 0;
                this.cbBaud.SelectedIndex = 0;
                this.btnStart.Tag = "0";                Thread dataThread = new Thread(new ThreadStart(sd.DealData));
                dataThread.IsBackground = true;
                dataThread.Start();                serialPort.DataReceived += new SerialDataReceivedEventHandler(SPort_ReceivedData);
                sd.SetStringOnboard += ShowMsg;
            }
        }
        private void SPort_ReceivedData(object sender, SerialDataReceivedEventArgs args)
        {
            int len = serialPort.BytesToRead;
            byte[] ReDatas = new byte[len];
            serialPort.Read(ReDatas, 0, ReDatas.Length);
            ShareData.setShareQuene(ReDatas);
        }
        private void initSPort()
        {
            if ("0".Equals(btnStart.Tag.ToString()))
            {
                serialPort.PortName = this.cbCom.Text.Trim().ToString();
                serialPort.BaudRate = Int32.Parse(this.cbBaud.Text);
                serialPort.Parity = Parity.None;
                serialPort.DataBits = 8;
                serialPort.StopBits = StopBits.One;
                if (!serialPort.IsOpen)
                {
                    try
                    {
                        serialPort.Open();
                    }
                    catch (Exception e)
                    {
                        MessageBox.Show(e.Message, "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
                        return;
                    }
                    btnStart.Tag = "1";
                    btnStart.Text = "关闭";
                    cbCom.Enabled = false;
                    cbBaud.Enabled = false;
                }
            }
            else
            {
                if (serialPort.IsOpen)
                {
                    try
                    {
                        serialPort.Close();
                    }
                    catch (Exception e)
                    {
                        MessageBox.Show(e.Message, "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    }
                    finally
                    {
                        serialPort.Close();
                    }
                    btnStart.Text = "开始";
                    btnStart.Tag = "0";
                    cbCom.Enabled = true;
                    cbBaud.Enabled = true;
                }
            }
        }
        private void btnStart_Click(object sender, EventArgs e)
        {
            initSPort();
        }
        private void ShowMsg(String msg)
        {
            Console.WriteLine("msg="+msg);
            this.Invoke(new setMsg(show), new object[] { msg });
        }
        private void show(string pmsg)
        {
             this.txtMsg.AppendText(pmsg);
        }        private void btnClear_Click(object sender, EventArgs e)
        {
            this.txtMsg.Clear();
        }
    }
}C#多线程串口通信线程紊乱