1

デバイスへのシリアル接続があり、デバイスからの応答の処理に問題があります。

ハイパーターミナルを使用TIMEしてデバイスにコマンドを送信すると、次のような応答が返されます。

TIME:13:30:30

これは同じ行で更新され続けます。アプリでこれを実行しようとすると、応答を表示するために RTB を使用しているか TB を使用しているかに応じて、どちらかになります。

RTB;

TIME:13:30:30
TIME:13:30:31
TIME:13:30:32
TIME:13:30:33
TIME:13:30:34

または結核;

TIME:13:30:30TIME:13:30:31TIME:13:30:32TIME:13:30:33TIME:13:30:34

コードは;

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

Private Sub ReceivedText(ByVal [text] As String)
    If Me.RichTextBox1.InvokeRequired Then
        Dim x As New SetTextCallback(AddressOf ReceivedText)
        Me.Invoke(x, New Object() {(text)})
    Else
        RichTextBox1.AppendText([text])
        TextBox1.AppendText([text])
    End If
End Sub

ハイパーターミナルを使用した場合と同じ応答を得る方法はありますか?

4

2 に答える 2

0

あなたのテキストボックス(TB)が持っていることを確認してください

textBox1.Multiline = True 
textBox1.AcceptsReturn = True 

TB は入力によく使用されるため、リターンは表示される代わりに、ユーザー入力の完了を知らせるために使用されます。


追跡の可能性が低い方法。

着信データTIME:13:30:30には、CR、LF、または CR+LF のいずれかの EOLine があります。 ReadExisting()着信データに問題がないように見えるため、余分な/予期しない EOL 文字がtext(CR + LF の場合) に潜んでいる可能性があることを除いて、これはおそらくシリアル データの問題ではなく、TB/RTB が処理するように構成されています。それらは異なります。予想される長さに注意するだけで、textこの懸念が検証されます。


注:
TB "NewLine 値が入力バッファーから削除されます。"
変更可能な NewLine の値。デフォルトは改行 (NewLine) です。

于 2013-06-20T12:28:56.367 に答える
0

StringBuilder私のアプローチは、フィールドセパレーターを含むイベントを受け取るまで、データを に蓄積することです。次にStringBuilder、フィールド セパレータで を 2 つに分割し、セパレータの前のすべてのデータをメッセージ ボックスの Text プロパティに設定してから、処理を続行します。このようなことを行う必要があります(疑似コードが続きます)

StringBuilder builder;

SerialPort1_DataReceived()
    receivedData = SerialPort1.ReadExisting()
    builder.Append(receivedData)

    if receivedData contains delimiter
        timeData = builder.ToString().Split(delimiter)
        ReceivedText(timedata[0])
        builder = new StringBuilder(timedata[1])
    end
end

そのため、シリアル ポートからの各ディスパッチをバッファに読み込みます。新しい時間値が開始されていることを示すインジケーターが含まれていることに気付いた場合は、インジケーターで分割し、テキスト ボックスにバッファーの先頭が含まれるように設定し、バッファーをクリアして残りを再挿入します。

そして ReceivedText では、変更します

RichTextBox1.AppendText([text])

RichTextBox1.Text = [text]

VB.NET コードがないことをお詫びします。私はこの言語にかなり慣れていないので、おそらく理解しやすいでしょう。ご不明な点がございましたら、またはこれがまったく機能するかどうかをお知らせください。

于 2013-03-05T18:50:42.647 に答える