C# 串口实时心电图
我们的要求是1秒钟512个点,把这一秒钟的数据平均显示在1秒的5个大格子里,这个应该怎么控制X轴的移动呢?
我现在是每2毫秒刷新一次(画一个点)这样1秒只能画500个点,2秒刷新一次界面闪屏很厉害,请各位大侠指点1、2.我的基本代码是这样的
private void Form1_Load(object sender, EventArgs e)
{
ptlist = new Point[this.pictureBox1.Width];
Point pt;
for (int i = 0; i < this.pictureBox1.Width; i++)
{
pt = new Point();
pt.X = i;
pt.Y = 255;
ptlist[i] = pt;
}
timer1.Enabled = true;
timer1.Interval = 2;
}
private void timer1_Tick(object sender, EventArgs e)
{
//pictureBox1画图区域
//ptlist
//alECGFisrt接收到的心电数据
DrawLineS(Color.Blue, pictureBox1, ptlist, alECGFisrt);
}
public void DrawLineS(Color color,PictureBox picbox, Point[] ptlist, ArrayList alECGFisrt)
{
mybitmap = new Bitmap(picbox.Width, picbox.Height);//设定位图大小
Graphics doublebufferg = Graphics.FromImage(mybitmap);//从位图上获取画布
doublebufferg.Clear(Color.White);//用背景色刷新
//pictureBox1填充为白色,便于显示图像
Rectangle rect = new Rectangle(0, 0, picbox.Width, picbox.Height);
doublebufferg.FillRectangle(new SolidBrush(Color.White), rect);
//画网格线
SetXAxis(ref doublebufferg, picbox);
SetYAxis(ref doublebufferg, picbox);
////绘制实时随机曲线
Point temp = new Point();
int ptX = 0;
for (int j = 1; j < picbox.Width-1; j++)
{
temp = ptlist[j + 1];
ptX = temp.X - 1;
ptlist[j] = new Point(ptX, temp.Y);
}
Point lastpt = new Point();
lastpt.X = picbox.Width;
if (alECGFisrt.Count > 0)
{
lastpt.Y = Convert.ToInt32(alECGFisrt[0].ToString());
alECGFisrt.RemoveAt(0);//画一个点移除出alECGFisrt
}
else
lastpt.Y = 255;//255是基线
ptlist[picbox.Width - 1] = lastpt;//替换最后一个点
doublebufferg.DrawLines(new Pen(Color.Red, 2), ptlist);
//将缓冲中的位图绘制到窗体上
Graphics g1 = picbox.CreateGraphics();//创建 PictureBox窗体的画布
g1.Clear(Color.White);
g1.DrawImage(mybitmap, 0, 0);
} C# 心电图 GDI+
[解决办法]
无需移动,双缓冲离屏绘制
[解决办法]
哎,后边的坐标首先是固定的就屏幕那么大。每次获得固定的长度绘制,下次从上次的结束出开始画。
[解决办法]
picturebox已经是双缓冲了.
楼主的一个画面可以设置画1000点.
每2ms就画
最新收到的数据总数-1000 到 最新收到的数据总数
这个范围就可以了.