タイトル | : 連続したシリアル通信処理 |
記事No | : 11229 |
投稿日 | : 2014/02/28(Fri) 22:13 |
投稿者 | : レフティー |
毎々お世話になっております。シリアル通信について教えて下さい。 以前より、カスタム基板との通信プログラムを作成しており、 流れは、 1.PC(アプリ)から基板へ、値の設定コマンド送信 2.基板からのレスポンスを受信(応答時間:およそ500msec) といった単純なものです。
困っているのは、基板へ連続して値を設定したいのですが、(以下の流れ) 1.PC(アプリ)から基板のチャンネルAへ、値の設定コマンド送信 2.基板からのレスポンスを受信 3.PC(アプリ)から基板のチャンネルBへ、値の設定コマンド送信 4.基板からのレスポンスを受信 現状上手くいきません。
送信側プログラムは、 Public Sub SetTemp(ByVal Setval As Double) 'チャンネルAへの設定 Try F1.SerialPort1.Write("チャンネルAへのコマンドおよび設定値" & vbLf) manualEvent.Reset() bret = manualEvent.WaitOne(500, False) If bret = False Then MessageBox.Show("Timeout Error", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error) End If Catch ex As Exception MessageBox.Show(ex.Message, "エラー", MessageBoxButtons.OK, MessageBoxIcon.Error) End Try
'チャンネルBへの設定 Try F1.SerialPort1.Write("チャンネルBへのコマンドおよび設定値" & vbLf) manualEvent.Reset() bret = manualEvent.WaitOne(500, False) If bret = False Then MessageBox.Show("Timeout Error", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error) End If Catch ex As Exception MessageBox.Show(ex.Message, "エラー", MessageBoxButtons.OK, MessageBoxIcon.Error) End Try End Sub
といった具合で、受信側は、 Private Sub SerialPort1_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived Dim strDataReceived As String = "" Dim add As New AddDataDelegate(AddressOf AddData)
Try strDataReceived = SerialPort3.ReadLine 'NewLine値まで読み込み comFlg = 3 SerialPort3.DiscardInBuffer() '受信バッファクリアのつもり manualEvent.Set() Catch ex As Exception strDataReceived = ex.Message End Try TextBox1.Invoke(add, strDataReceived) End Sub
1.チャンネルAへのコマンド送信。スレッドをブロック 2.基板からの応答を受信。シグナル状態へセット 3.スレッドブロック解除、チャンネルBへのコマンド送信。再度スレッドをブロック 4.基板からの応答を受信。シグナル状態へセット 5.スレッドブロック解除 というシーケンスをイメージで作成したのですが、 2つ目のコマンド送信時にbretがFalseとなってしまい、タイムアウトエラーとなってしまいます。 アドバイスいただけますと助かります。
|