我最近做串口实时曲线的一个实验平台,可是曲线总出不来,也不知道是哪里出了问题,望各位大侠指点,我把代码贴上
AutoResetEvent detailCollectedEvent = new AutoResetEvent(false);//生命一个等待事件,用做线程开关 private void Form1_Load(object sender, EventArgs e)
        {
            cbcomlist.DataSource = GetComList();//获取可用的com口
            mythread = new Thread(new ThreadStart(drawing));//新线程
            mythread.Start();//线程开始
            //mythread.Suspend();
            
        }
 private void button1_Click(object sender, EventArgs e)
        {
            try
            {
                com.DataReceived += com_DataReceived;//注册datareceive事件
                com.PortName = cbcomlist.Text.Trim();//串口号
                com.BaudRate = 115200;//波特率
                com.DataBits = 8;//数据位
                com.StopBits = StopBits.One;//停止位
                com.Parity = Parity.None;//校验位
                com.ReadBufferSize = 100;//设置输入缓存区大小
                com.ReadTimeout=1000;//设置读取操作未完成时发生超时之前的毫秒                com.Open();//打开串口
            }
            catch (Exception e1)
            {
                MessageBox.Show("串口" + cbcomlist.Text + "问题:" + e1.Message);
                
            }
string[] GetComList()
        {
            RegistryKey subkey = Registry.LocalMachine.OpenSubKey("HARDWARE").OpenSubKey("DEVICEMAP").OpenSubKey("SERIALCOMM");
            string[] strnames = subkey.GetValueNames();
            string[] strkeys = new string[strnames.Length];
            for (int i = 0; i < strnames.Length; i++)
                strkeys[i] = subkey.GetValue(strnames[i], "COMM-1").ToString();
            subkey.Close();
            return strkeys;
        }
void com_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            int n = com.BytesToRead;//一次达到的数据量
        
            byte[] buf = new byte[n];//定义数组接收
            com.Read(buf, 0, n);//读串口
          //  int k = my_date.Count;
            lock (my_date)
            {
                for (int i = 0; i < n; i++)
                {
                    //my_date[k+i]= buf[i];                    my_date.Add(buf[i]);//将读到的数据存入链表中保存
                }
            }
                builder.Clear();//字符串构建先清空
            foreach (byte b in buf)       //依次的拼接出16进制字符串   
            {
                builder.Append(b.ToString("X").PadLeft(2,'0') + " ");
            }
            string str = builder.ToString();            detailCollectedEvent.Set();//触发画图线程
        }
protected void drawing()
        {
            detailCollectedEvent.WaitOne();
                lock (my_date)
                {
                    if (my_date[0] == 0xff && my_date[1] == 0xff)
                    {
                        short k1 = (short)my_date[0];
                        short k2 = (short)my_date[1];                        short data1_2 = (short)my_date[2];
                        short data1_1 = (short)my_date[3];
                        data1_1 <<= 8;                        data_x = (short)(data1_1 + data1_2);                        short data2_2 = (short)my_date[4];
                        short data2_1 = (short)my_date[5];
                        data2_1 <<= 8;                        data_y = (short)(data2_1 + data2_2);                        short data3_2 = (short)my_date[6];
                        short data3_1 = (short)my_date[7];
                        data3_1 <<= 8;                        data_z = (short)(data3_1 + data3_2);                        my_date.RemoveRange(0, 8);
                    }
                    else
                    {
                        //my_date.Remove(my_date[0]);
                        my_date.RemoveAt(0);
                    }
                }
            if(this.InvokeRequired)
                this.Invoke(new MethodInvoker(delegate
                {
                    this.chart1.Series[0].Points.AddY(data_x);
                    this.chart2.Series[0].Points.AddY(data_y);
                    this.chart3.Series[0].Points.AddY(data_z);
                    //this.chart3.Series[0].Points.AddY(3000);                    while (chart3.Series[0].Points.Count > 20)
                    {
                        chart1.Series[0].Points.RemoveAt(0);
                        chart2.Series[0].Points.RemoveAt(0);
                        chart3.Series[0].Points.RemoveAt(0);
                    }                    chart1.ChartAreas[0].AxisX.Minimum = chart1.Series[0].Points[0].XValue;
                    chart1.ChartAreas[0].AxisX.Maximum = chart1.Series[0].Points[0].XValue + 20;                    chart2.ChartAreas[0].AxisX.Minimum = chart1.Series[0].Points[0].XValue;
                    chart2.ChartAreas[0].AxisX.Maximum = chart1.Series[0].Points[0].XValue + 20;                    chart3.ChartAreas[0].AxisX.Minimum = chart1.Series[0].Points[0].XValue;
                    chart3.ChartAreas[0].AxisX.Maximum = chart1.Series[0].Points[0].XValue + 20;
                }));
}