Visual Basic 中学校 掲示板 投稿の管理
タグのない投稿を抽出
統計
RSS
Visual Basic 中学校
投稿一覧
シリアル通信 初心者
この投稿へのリンク
https://keijiban.umayadia.com/ThreadDetail.aspx?ThreadId=24889#CommentId65402
この投稿の削除
削除パスワード
削除する
コメント本文
投稿者
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