winform编程:实现串口不断接收数据(我的是心电板,其实是想画心电图,40ms发送一个数据包,里面包含8个数据),并把数据作为一个参数,用来在以panel为画布进行绘图的参数。其中还要使用到timer。求各位大侠给个思路,这是不是关乎到两个进程?我是初学者,头脑里乱七八糟的。以下是我写的杂七杂八的代码。(是否需要两个中断?如果是该怎么使用,如果不需要又该怎么让窗口不断接收数据又可以让panel不停的画心电图。)
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Collections;
using System.Timers;namespace ecg3
    {
    public partial class Form1 : Form
        {        ArrayList data = new ArrayList();
        Pen myPen = new Pen(Color.Red);
        #region xy增益与坐标申明
        private float xGain;//x增益
        System.Timers.Timer t = new System.Timers.Timer();
                public Form1()
            {
            InitializeComponent();
            
            }
           public float XGain
            {
            get { return xGain; }
            set { xGain = value; }
            }
        private float yGain;//y增益        public float YGain
            {
            get { return yGain; }
            set { yGain = value; }
            }
        private float xOrigin;//x原点        public float XOrigin
            {
            get { return xOrigin; }
            set { xOrigin = value; }
            }
        private float yOrigin;//y原点        public float YOrigin
            {
            get { return yOrigin; }
            set { yOrigin = value; }
            }
        private float xNext;//x新坐标        public float XNext
            {
            get { return xNext; }
            set { xNext = value; }
            }
        private float yNext;//y新坐标        public float YNext
            {
            get { return yNext; }
            set { yNext = value; }
            }
        private float i;        public float I
            {
            get { return i; }
            set { i = value; }
            }
        #endregion
        private void Form_Load(object sender, EventArgs e)
            {
            serialPort.Open();
            xOrigin = 0;
            yOrigin = this.panel.Height / 2;
            serialPort.DataReceived+=new System.IO.Ports.SerialDataReceivedEventHandler(serialPort_DataReceived);            t.Enabled = true;
            t.Interval = 4;
            t.AutoReset = true;
            t.Elapsed += new ElapsedEventHandler(panel_Paint);//这个地方不能这样使用
            
            }        //private void t_Elapsed(object source, ElapsedEventArgs e)
        //    {
        //    data.Add(serialPort.ReadByte());
        //    }        private void panel_Paint(object sender, PaintEventArgs e)
            {            Graphics g = e.Graphics;
           // int ii = i;
          
                xGain = i;
                i=(float)(i+0.01);
               
                yGain = float.Parse(data[7].ToString());
                data.Clear();
                xNext = xGain + xOrigin;
                yNext = yGain + yOrigin;
                g.DrawLine(myPen, xOrigin, yOrigin, xNext, yNext);
                xOrigin = xNext;
                yOrigin = yNext;
               
            }        private void beginBtn_Click(object sender, EventArgs e)
            {
            this.beginBtn.Visible = false;
            serialPort.Open();
            }   
        private void serialPort_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
            {
            for (int d = 0; d < 8; d++)
                {
                data.Add(serialPort.ReadByte());
                }
            }        private void closeBtn_Click(object sender, EventArgs e)
            {
            this.closeBtn.Visible = false;
            serialPort.Close();
            }
        }
    }