RS232 を使用して AND GF 3000 e-scale に接続する必要があります。HyperT と AND 独自のプログラムを使用して接続をテストしましたが、動作しています。今、私は物事を読むためのVBアプリを作成していますが、これまでのところ実際に機能しています。ただし、いくつかの部分でかなりバグがあるため、最適化したいと考えています。
以前の読み取りコマンドは次を使用します。
Private Sub mscport_DataReceived(ByVal sender As System.Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles mscport.DataReceived
Dim tmpBuf As String
tmpBuf = mscport.ReadLine
End Sub
これは私が使用しているもののフルバージョンではありませんが、それ以外は機能します。ただし、終了して再接続すると (私は Windows フォーム コントロールを使用しています)、「スレッドの終了またはアプリケーションの要求により、I/O 操作が中止されました」という例外が発生します。ネットを見回すと、ここのディック・グリアから理由がわかりました:http://www.pcreview.co.uk/forums/serial-port-error-o-operation-has-been-abortedbecause-either-thread- exit-application-request-t2781073.html :
これが意味することは、ほぼ確実に、ポートが閉じられた後に SerialPort オブジェクトが ReadLine への呼び出しを完了しようとしたことです。これは、ポートを閉じる可能性のある UI イベントと、実際の ReadFile 操作を実行している SerialPort オブジェクトのバックグラウンド スレッドとの間の同期が欠如しているために発生する可能性があります (これは、デリゲートの ReadLine の結果として実行されます)。
ReadLine の問題、および私がそれを使用しない理由は、行の終了条件が発生するまでブロックされることです。これは、ポートを閉じた後である可能性があります。したがって、例外。
私は、自分のデータを静的またはクラスレベルの変数 (すべて ReadExisting で新しいデータをバッファーに追加する) に単純にバッファーし、そのバッファーで vbCrLf 終端文字をテストすることを好みます。vbCrLf が見つかった場合 (InStr または Substring から選択)、デリゲートを呼び出して、バッファー内のデータを処理および表示します。コンテンツを処理して表示した後、このバッファをクリアすることを忘れないでください。これを行うと、例外が解決されるはずです。
ディック
以前、私のアプリは、シリアル-シリアル接続に ReadLine の代わりに ReadExisting を使用していました。その後、USB シリアル ケーブルを使用すると、ReadExisting が機能しなかったので、代わりに ReadLine を使用しました。USBケーブルを使いたいので、ReadLineを置き換える方法を探す必要があります。今、私はシリアルポートで大きな揺れはありませんが、ここにある ReadChar を使用して ReadLine を置き換えるほとんど機能するコードを作成することができました:
Private Sub mscport_DataReceived(ByVal sender As System.Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles mscport.DataReceived
Dim tmpbuf As String
Dim bytebuffer(17) As Byte
Dim count As Integer = 17
Try
While count > 0
bytebuffer(17 - count) = mscport.ReadChar
'If bytebuffer(17 - count) = vbCrLf Then
'End If
'tmpBuf = tmpBuf & mscport.ReadExisting
count = count - 1
End While
Catch ex As InvalidOperationException
MessageBox.Show(ex.Message)
Catch ex As UnauthorizedAccessException
MessageBox.Show(ex.Message)
Catch ex As System.IO.IOException
MessageBox.Show(ex.Message)
End Try
tmpbuf = tmpbuf & System.Text.Encoding.ASCII.GetString(bytebuffer, 0, 17)
'tmpBuf = bytebuffer.ToString()
ReceiveData(tmpbuf)
End Sub
新しいコードの問題:
IO 例外がまだ残っています。アプリを開いたときにトリガーされることがあります。そのすべての例外があっても、まだキャッチされませんでした。
データがごちゃごちゃして受信されることがあります。たとえば、ST 0009.80 g は .80 gST 0009 と表示されます。データは CrLf で終わるため、表示する前にどのように並べ替えるかをまだ考えています。
これを行うためのより良い方法があることは知っていますが、思いつきませんでした。または、十分に検索していない可能性があります。