当前位置:编程学习 > C#/ASP.NET >>

c#串口通信,线程错乱,求大神指导,发送一次数据,收到2倍数据,实际是4个线程,看后台线程会退出3个,不知为什么,求指导,谢谢。

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# 多线程 串口通信 线程紊乱 --------------------编程问答-------------------- 这种线程问题 没有完整代码调不出来 
--------------------编程问答-------------------- rinall----是完整的代码啊。
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,