注册 登录
编程论坛 VB.NET论坛

vb.net chart 动态曲线

gowine 发布于 2016-04-10 09:29, 16098 次点击
只有本站会员才能查看附件,请 登录

如图,X轴为时间,Y轴为幅度,幅度值是从串口返回的值,每次接收到串口返回的幅度值就在chart上面绘制数据点。现在问题有两个:
1. 程序运行时X轴上的时间标签全部不要显示,当有幅度值返回时在chart上打上数据点,同时X轴对应地显示当前时间的标签。
2. 当数据曲线绘制到chart右边边界的时候,能实现不压缩网格大小的动态显示,也就是最左边一格的左移出显示界面以给右边空间绘制曲线。

恳求各位大神拔刀相助,在线等源码。。。。。。。。。万分感谢!!!!!编辑环境VB2010
8 回复
#2
不说也罢2016-04-10 17:21
这里给你一个例子,模拟下。你可以稍加修改取数函数变为从串口获得的返回值
程序代码:

'新建项目时,在默认窗体Form1上添加一个按钮,一个chart
Public Class Form1
    Dim x(10) As String, y(10) As Double '示例中显示11条数据
    Dim yy() As Double

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        '按钮单击事件模拟取数
        yy = GetValue()
        Dim i As Integer
        For i = 0 To yy.Length - 1
            y(i) = yy(i)
        Next

        Chart1.Series(0).ChartType = DataVisualization.Charting.SeriesChartType.Line
        Chart1.Series(0).Points.DataBindXY(x, y)

        Chart1.Series(0).IsValueShownAsLabel = True
        Chart1.Series(0).LabelForeColor = Color.Red
        Chart1.ChartAreas(0).AxisX.Minimum = 0
        Chart1.ChartAreas(0).AxisX.Maximum = yy.Length
        Chart1.ChartAreas(0).AxisX.Interval = 1
    End Sub
    Private Sub Form1_Load(ByVal sender As Object, ByVal e As EventArgs) Handles MyBase.Load
        Chart1.Dock = DockStyle.Fill
        Button1.BringToFront()
        Chart1.ChartAreas(0).AxisX.MajorGrid.Enabled = False
        Chart1.ChartAreas(0).AxisY.MajorGrid.Enabled = False
    End Sub
    Function GetValue() As Array '这是一个模拟取数的函数
        Dim a As Integer = 0
        If yy Is Nothing Then
            a = 0
        Else
            a = yy.Length
        End If
        If a = 11 Then
            For i As Integer = 0 To 9
                yy(i) = yy(i + 1)
                x(i) = x(i + 1)
            Next
            yy(10) = Math.Round(a * Rnd(100) * 1.0264, 2)
            x(10) = Format(Now, "hh:mm:ss")
        Else
            ReDim Preserve yy(a)
            yy(a) = Math.Round(a * Rnd(100) * 1.0264, 2)
            x(a) = Format(Now, "hh:mm:ss")
        End If
        Return yy
    End Function
End Class


其他的你再琢磨琢磨,下面是运行测试程序的截图
只有本站会员才能查看附件,请 登录

#3
精卫岛2016-04-11 10:53
#4
gowine2016-04-11 17:28
2楼的前辈,真的非常感谢你,整合到我的工程里面完美的用得上,真的非常感谢!
现在再请教个问题,在这个前提下再增加一条不同颜色的曲线,因为串口那边有两组数据返回;顺便问一下,向下位机发送读取指令后,其返回两组数据,返回第一组数据后间隔两秒再返回第二组数据,问题是怎么才可以把这两组数据全部接收下来?不胜感激!
#5
gowine2016-04-12 06:57
以下是引用gowine在2016-4-11 17:28:27的发言:

2楼的前辈,真的非常感谢你,整合到我的工程里面完美的用得上,真的非常感谢!
现在再请教个问题,在这个前提下再增加一条不同颜色的曲线,因为串口那边有两组数据返回;顺便问一下,向下位机发送读取指令后,其返回两组数据,返回第一组数据后间隔两秒再返回第二组数据,问题是怎么才可以把这两组数据全部接收下来?不胜感激!

二楼的前辈,添加曲线的问题在你原有的例程中添加一个数据就解决了,现在是串口的那两组数据怎么接收到问题了。在线等。。。。。。。。。。。。。。。。
#6
不说也罢2016-04-12 11:38
不是很明白你的意思。总之,在数据接收完后DataBindXY就可以了。
#7
gowine2016-04-12 18:03
以下是引用不说也罢在2016-4-12 11:38:12的发言:

不是很明白你的意思。总之,在数据接收完后DataBindXY就可以了。

谢谢你的指点,问题已经解决。
#8
newxin2019-07-17 14:29
谢谢!
#9
z3753234242020-03-04 17:56
谢谢!
1