2

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 ポートから受信した数値がどのように、またなぜ変化するのですか?

4

1 に答える 1

0

ハンスは正しいです。COM ポートから 1 つの読み取り値を取得するには、Readline() を使用する必要があります。ReadExisting は、COM ポート バッファにあるものすべてを提供します。

于 2013-08-12T19:44:38.120 に答える