C#动态绘制心率折线图(串口通信)

本文介绍了如何使用C#结合stm32心率监测传感器,通过蓝牙接收数据并动态绘制心率折线图。文章通过设置Timer控件定时刷新,使用PictureBox控件展示,并详细说明了数据处理和坐标定位的过程。示例代码中,根据以Q开头的数据包进行绘图,目前实现的是简单动态绘制,未来计划进一步优化。

硬件背景:基于stm32芯片,挂载心率监测传感器通过蓝牙传输数据的 心率监测仪

本文将介绍下如何根据 接收到的数据进行动态绘制心率折线图(大神请绕步,此乃菜鸟分享show)


首先,本案例是比较粗糙的动态绘制心率折线图,所以这里拿时间变量来刷新绘制折线图

一:在可视化界面中添加 Timer 控件,命名为TimRead.如下:


二:在可视化界面中添加PictureBox控件,此控件用于显示折线图,命名为picDataDraw;

  

    (坐标以及坐标轴如图所示)

三:准备一个数组和一个变量,用于定位绘图的坐标


窗口初始化的一下设置:

  //窗体初始化
        private void Form1_Load(object sender, EventArgs e)
        {
            //初始化下拉串口名称列表框
            string[] ports = SerialPort.GetPortNames();
            Array.Sort(ports);
            comboPortName.Items.AddRange(ports);
            comboPortName.SelectedIndex = comboPortName.Items.Count > 0 ? 0 : -1;
            comboBaudrate.SelectedIndex = comboBaudrate.Items.IndexOf("9600");

            //初始化SerialPort对象
            comm.NewLine = "\r\n";
            comm.RtsEnable = true;//根据实际情况吧。
            comm.ReceivedBytesThreshold = 6;//触发字节数是11   ##特别重要 这是根据实际收发数据协议而定的,譬如数据包大小

            //添加事件注册
            comm.DataReceived += comm_DataReceived;
        }

因为所使用的心率传感器发送过来的数据是有三部分的,所以每一部分都进行数据打包,有包头包尾


也可以参考我另一篇(C#上位机之多编辑框输出

根据代码,容易看出,是根据 Q 开头的数据包进行绘图

四.回到可视化界面,双击之前定义的Timer(命名为TimRead的那个控件),编码如下:

 private void timRead_Tick(object sender, EventArgs e)
        {
            //MessageBox.Show("timRead_Tick", "系统提示");
            Bitmap image = new Bitmap(600, 256);              //设定位图的大小
            Graphics graphics = Graphics.FromImage(image);    //获得图象对象
            Pen pen = new Pen(Color.Red);                     //获得画笔
            int rawY = this.RawY0;                            //RawY0就是之前的数组坐标,表示在位图中的Y轴的位置
            for (int i = 0; i < 599; i++)                     //容错优化
            {
                int num = rawY + i;
                if (num > 599)
                {
                    num -= 600;
                }
                int num2 = rawY + i + 1;
                if (num2 > 599)
                {
                    num2 -= 600;
                }
                graphics.DrawLine(pen, i, (1024 - this.RawY[num]) / 4, i + 1, (1024 - this.RawY[num2]) / 4);
                //graphics.DrawLine(pen, 0, 0, 599, 255);
                //绘画两点之间的直线
            }
            this.picDataDraw.Image = image;
        }

上面就是具体绘图涉及到的算法了。有什么疑问可以和我讨论。

效果如下:


后续会完善这个软件。




评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值