COM1 ポートに接続された距離追跡レーザーがあり、これらの設定を使用して接続を初期化しています。
With ServoCalibrater.LaserPort
.BaudRate = 19200
.DataBits = 8
.StopBits = IO.Ports.StopBits.One
.Parity = IO.Ports.Parity.None
.StopBits = IO.Ports.StopBits.One
.Close()
.Open()
.Write("dt")
End With
次に、受信したデータを次の関数で処理します (Reading は double 型のグローバル変数で、ErrorMessage は string 型のグローバル変数です)。
Private Sub LaserPort_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles LaserPort.DataReceived
ComRecv = True
Dim TempRead As String
TempRead = LaserPort.ReadExisting()
If Not IsNumeric(TempRead) Then
If Asc(TempRead) = 13 Then
TempRead = "*No Data*"
End If
ErrorMessage = "Laser Error " & TempRead & "... Please restart application, then turn laser off and back on."
Else
Reading = ErrorMessage
End If
End Sub
Reading
ここから、フォームに値を取得したいと思います。スレッドセーフではないため、メソッドで直接行うことはできません。したがって、現在試みられている解決策は、タイマーReading
に 10 分の 1 秒ごとの値をチェックさせ、フォームに追加することです。私はこの tick メソッドでそうします:
Private Sub tmrMonitor_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles tmrMonitor.Tick
Dim MeasuredDistance As New clsDimension
Dim DesiredDistance As New clsDimension
'Check to see if we've got com with the laser so we can alert the user if not
If Not ServoCalibrater.ComRecv Then
LaserError.Text = "No communication received from the laser. Please check to make sure it's turned on."
Else
CurrentPosText.Text = Reading
Refresh()
End If
End Sub
上記のコードは、デバッガーをステップ実行すると完全に機能するようです。ただし、デバッガーなしでフォームを表示すると、CurrentPosText.Text に表示される数値は、レーザーからの期待値とはまったく異なります。
Putty.exeで同じコマンドを発行して、レーザー値が正しいことを確認しました。
パテからの一貫した結果と設定は次のとおりです。(リンクをたどってビデオを見てください)
TLDRこのビデオをご覧ください
デバッガーを使用せずにフォームに表示すると、COM ポートから受信した数値がどのように、またなぜ変化するのですか?