Member 10569715 Ответов: 2

Как построить график реального времени visual basic


я могу построить график в реальном времени с данными из последовательного порта
но шкала времени по оси X была такой же

например, 5sec и 30sec строят график одинаковой ширины.

любая помощь будет очень признательна


Imports System.Windows.Forms.DataVisualization.Charting
Public Class Form1
    Dim portdata As String
    Dim vArray As Array
    Dim time As String
    Dim engChart As New Series
    Dim pwrChart As New Series


    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Chart1.Series.Clear()
        Chart1.Titles.Add("Wireless energy meter chart")
        engChart.Name = "Energy"
        pwrChart.Name = "Power"
        engChart.ChartType = SeriesChartType.Line
        pwrChart.ChartType = SeriesChartType.Line
        Chart1.Series.Add(engChart)
        'Chart1.Series.Add(pwrChart)
        If SerialPort1.IsOpen Then ' check if serial port is open
            SerialPort1.Close()     'close serial port of is open
        End If

        SerialPort1.PortName = "COM1"
        SerialPort1.BaudRate = 9600
        SerialPort1.Parity = IO.Ports.Parity.None
        SerialPort1.DataBits = 8
        SerialPort1.StopBits = IO.Ports.StopBits.One
        SerialPort1.RtsEnable = True
        SerialPort1.Open()

    End Sub

    Private Sub SerialPort1_DataReceived(ByVal sender As System.Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived

        System.Threading.Thread.Sleep(500)

        portdata = SerialPort1.ReadExisting

        vArray = Split(portdata, ",")
        Me.Invoke(New EventHandler(AddressOf DoUpdate))
        'My.Computer.FileSystem.WriteAllText("C:\TestFolder1\123.txt", Now, True)
        My.Computer.FileSystem.WriteAllText("C:\TestFolder1\123.txt", portdata, True)



    End Sub
    Public Sub DoUpdate()

        lblEnergyDsp.Text = vArray(0)
        lblPowerDsp.Text = vArray(1)


        engChart.Points.AddXY(time, vArray(0))
        pwrChart.Points.AddXY(time, vArray(1))




    End Sub
    Private Sub Form1_FormClosed(ByVal sender As System.Object, _
                   ByVal e As System.Windows.Forms.FormClosedEventArgs) _
                   Handles MyBase.FormClosed
        ' Close the Serial Port
        SerialPort1.Close()

    End Sub


    Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
        time = TimeOfDay


    End Sub
End Class

Thava Rajan

пожалуйста, покажите ваши данные порта

S Houghtelin

+5 за показ вашего кода и за использование форматирования. Вам нужно прочитать о правильном использовании serialport, я вижу ряд проблем и потенциал для блокировки приложения.

2 Ответов

Рейтинг:
1

S Houghtelin

Единственный раз, когда ваша диаграмма обновляется новыми данными, - это когда срабатывает ваше com-событие. Если вы хотите, чтобы ваша диаграмма обновлялась один раз в секунду, вызовите обновление диаграммы из события таймера.

Вы не должны использовать спящий поток в своем com-событии, скорее установите свой com-порт соответствующим образом.

'If you are expecting two bytes set the receive event to fire when you get them.
SerialPort1.ReceivedBytesThreshold = 2
'And if think it take a long time to get those two bytes...
SerialPort1.ReadTimeout = 500


Рейтинг:
1

Ebena

Проблема, похоже, кроется в вашей подпрограмме doupdate (). Замените "время" для оси X на "сейчас".

Вместо


Цитата:
энгхарт.Точки.AddXY (time, vArray(0))
pwrChart.Точки.AddXY (time, vArray(1))



Попробуй

engChart.Points.AddXY(Now, vArray(0))
        pwrChart.Points.AddXY(Now, vArray(1))



Овации


Richard Deeming

Этот вопрос был задан и на него был дан ответ ТРИ ГОДА НАЗАД.