Visual Basic 中学校 掲示板 投稿の管理
タグのない投稿を抽出
統計
RSS
Visual Basic 中学校
投稿一覧
Timerコントロールの精度
この投稿へのリンク
https://keijiban.umayadia.com/ThreadDetail.aspx?ThreadId=30290#CommentId83107
この投稿の削除
削除パスワード
削除する
コメント本文
投稿者
vb素人
 (学生)
投稿日時
2017/10/3 09:50:40
魔界の仮面弁士さま
返信ありがとうございます。
受信からプロットまでの流れを↓にまとめてみました。
3つの独立した作業について、実際のコードは次のようになっていると考えています。(①~④)
>(a) 受信処理:シリアル通信で送られてきたデータをフィールド変数に蓄えていく
①
>(b) 加工処理:受信データをグラフ用の座標データに切り出す
②
>(c) 描画処理:座標データを Chart にプロットしていく
③、④
Timer10msec設定(データプロット数100): 約6秒
Timer1msec設定(データプロット数1000): 約3分10秒
Timerインターバルの時間を短くすると、描画終了までの時間が長くなっているということは、
送信~②まででに時間が掛かっているということでしょうか。
10msec設定で約6秒掛かっていたので、
60msecにすれば、1秒に近づくのではと思い、実験してみたところ、約1秒(ストップウォッチ測定なので、あまり正確ではありませんが…)となりました。
これは、送信~②まで(データが揃うまで)最低でも60msecは掛かるので、
60msec以下のインターバルで測定する場合は、
実際の時間とプロットする時間軸がずれるという理解で良いのでしょうか。
この考えが正しいとして…
60msec以下のインターバルでも実時間に近い時間間隔でプロットさせるためには、
送信~②までの部分で改善が必要という理解で良いでしょうか。
'①受信したデータを正しい順番a-b-cの順番でReceivedへ渡す
Private Sub SerialPort1_DataReceived(sender As Object, e As SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived
Received(a, b, c)
End Sub
'②a,b,cをグローバル変数へ代入。テキストボックスに受信データを表示
Private Sub Received(a As UShort, b As UShort, c As UShort)
xdata = 1023 - x
ydata = 1023 - y
zdata = 1023 - z
RcvXTextBox.AppendText(Str(x))
RcvYTextBox.AppendText(Str(y))
RcvZTextBox.AppendText(Str(z))
'グラフ設定(ラインの色設定、マーカーの大きさ、色設定)
End Sub
'③Timer有効、Series設定
Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
'Timerインターバル設定、Timer有効化
Timer1.Interval = CInt(TextBox1.Text)
Timer1.Enabled = True
'Series設定
Dim xaxis = Chart1.Series.Add("X-Axis")
Dim yaxis = Chart1.Series.Add("Y-Axis")
Dim zaxis = Chart1.Series.Add("Z-Axis")
'グラフタイプの設定
xaxis.BorderWidth = 3
xaxis.BorderDashStyle = ChartDashStyle.Solid
xaxis.ChartType = SeriesChartType.Line
yaxis.BorderWidth = 3
yaxis.BorderDashStyle = ChartDashStyle.Solid
yaxis.ChartType = SeriesChartType.Line
zaxis.BorderWidth = 3
zaxis.BorderDashStyle = ChartDashStyle.Solid
zaxis.ChartType = SeriesChartType.Line
'csvファイルへのタイトル書き込み
Dim sw As System.IO.StreamWriter
sw = New System.IO.StreamWriter("accel.csv", False,
System.Text.Encoding.GetEncoding(932))
sw.WriteLine("x" & ",y" & ",z" & ",time")
sw.Close()
End Sub
'④データプロット
Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
'描画処理
Chart1.Series(0).Points.AddXY(time, xdata)
Chart1.Series(1).Points.AddXY(time, ydata)
Chart1.Series(2).Points.AddXY(time, zdata)
'データ書き込み
Dim sw As System.IO.StreamWriter
sw = New System.IO.StreamWriter("accel.csv", True,
System.Text.Encoding.GetEncoding(932))
sw.WriteLine(xdata & "," & ydata & "," & zdata & "," & time)
sw.Close()
End Sub