投稿者 YUU  (社会人) 投稿日時 2015/8/14 10:26:44
daive様、いつも返信ありがとうございます。

>今回の話の基盤を作るためには、

1、機器に関しては私は把握しておりません。(薄い仕様書(説明書程度)を頂いたのみ)
  何かしらの検査機器のようです。(URL,機器名の記載なし)

2、通信仕様は上記にも書いておりますが、
伝送方式:調歩同期式
伝送速度:9600bps
伝送コード:ASCII
データビット:8bit
パリティチェック:なし
ストップビット:1bit
フロー制御なし(X-ON/X-OFF)
ハンドシェイク

電文は固定長で長さが決められております。

状況としては上記では電文をイベントで受診できたと記載しているのですがそれは「無手順」の設定で取得できていたというものでした。

要望としては「ACK」,「NAK」のやり取りをしエラーを最小限にするというものらしく「ハンドシェイク」の設定が必要となってきます。

しかし、ハンドシェイクの設定後、受信イベントが走らない模様です。何か原因があるのでしょうか?

シリアル通信初心者の為、至らなぬ点ばかりで申し訳ありません。

下記がコードです。だいぶ省略していますが要点のみ。

'ボタンイベント
        If SerialPort.IsOpen = True Then
            SerialPort.DiscardInBuffer()       '受信バッファ破棄
            Try
                SerialPort.Close()             'シリアルポートをクローズ
                cmbComPort.Enabled = True
                cmbBaudRate.Enabled = True
                cmbHandShake.Enabled = True
                btnConnect.Text = "接続"
            Catch ex As Exception
                MessageBox.Show(ex.Message, "エラー", MessageBoxButtons.OK, MessageBoxIcon.[Error])
            End Try
        Else
            Dim baud As BuadRateItem = CType(cmbBaudRate.SelectedItem, BuadRateItem)
            Dim ctrl As HandShakeItem = CType(cmbHandShake.SelectedItem, HandShakeItem)

            SerialPort.PortName = cmbComPort.SelectedItem.ToString()
            SerialPort.BaudRate = baud.Baudrate
            SerialPort.Handshake = ctrl.Handshake
            SerialPort.Parity = Parity.None
            SerialPort.DataBits = 8
            SerialPort.StopBits = StopBits.One
            SerialPort.Encoding = Encoding.ASCII
            SerialPort.NewLine = "\r"
            SerialPort.DtrEnable = True
            SerialPort.RtsEnable = True

            'SerialPort.ReadTimeout = 1000        '受信タイムアウト時間

            Try
                SerialPort.Open()

                cmbComPort.Enabled = False
                cmbBaudRate.Enabled = False
                cmbHandShake.Enabled = False

                btnConnect.Text = "切断"
            Catch ex As Exception    '開けなかった場合の例外処理
                MessageBox.Show(ex.Message, "エラー", MessageBoxButtons.OK, MessageBoxIcon.[Error])
            End Try
        End If

   ''' <summary>
    ''' データ受信が発生したときのイベント処理
    ''' </summary>
    ''' <param name="sender"></param>
    ''' <param name="e"></param>
    ''' <remarks></remarks>
    Private Sub SerialPort_DataReceived(sender As Object, e As SerialDataReceivedEventArgs) Handles SerialPort.DataReceived

        'シリアルポートをオープンしていない場合、処理を行わない
        If SerialPort.IsOpen = False Then
            Return
        End If

        Dim Len As Integer = SerialPort.BytesToRead  '受信バイト数取得
        Dim InData(Len - 1) As Byte                     '受信値読み込み配列

        SerialPort.Read(InData, 0, Len)                  '読み込み

        ''1バイトずつメインスレッドにてテキストボックス書込み
        For i As Integer = 0 To InData.Length - 1
          Me.Invoke(New dlgReceive(AddressOf RcvDataToTextBox), InData(i))
        Next

End Sub