したらばTOP ■掲示板に戻る■ 全部 1-100 最新50 | メール | |

SerialPort.Readについて

1たか:2010/02/16(火) 11:27:38
お世話になります。

WEB(VB2005)で調べたソースをお借りして
シリアル通信のプログラムを作成しています。
受信することは出来たのですが
数十回に一度、以下のような異常が発生しています。
何か良い対処方法を教えていただきたいです。


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

Dim dlgData As ReceiveDataDelegate = New

ReceiveDataDelegate(AddressOf DataAnalyze)

Dim ReadBuff(SerialPort1.BytesToRead - 1) As Byte

SerialPort1.Read(ReadBuff, 0, SerialPort1.BytesToRead) ←①

For i As Integer = 0 To ReadBuff.Length - 1
Me.Invoke(dlgData, CInt(ReadBuff(i)))
Next
End Sub

 ①の部分で ArgumentException
配列のオフセットおよび長さが範囲を超えているか、カウンターがソースコレクションのイ
  ンデックスから最後までの要素の数より大きい値です。

 ReadBuff{Length=1}
(0)0

宜しくお願いします。

2igoten:2010/02/16(火) 12:54:12
今日は
SerialPort1_DataReceivedの処理中に次のSerialPort1_DataReceived割り込みがかかっている
可能性がありますね。
Static又はSerialPort1_DataReceivedイベントの外側でFlgを設定して
処理中は次の割り込みがかからないようにしてみて下さい。

Private Sub SerialPort1_DataReceived(ByVal sender As System.Object, _
ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) _
Handles SerialPort1.DataReceived
Static flg As Boolean
If flg = True Then
Exit Sub
End If
flg = True
'処理
flg = False
End Sub

3たか:2010/02/16(火) 14:50:47
回答ありがとうございます。

最初に書き込んだプログラムと少し異なるのですが
flg を Static や
SerialPort1_DataReceivedイベントの外側(Public)で指定したのですが
①の部分で、同じ異常が発生します。

受信データに改行が見つからないので
②のようにしているのですが
その操作が、悪影響を与えているのでしょうか?

宜しくお願いします。


Private Sub SerialPort2_DataReceived(ByVal sender As Object, _
ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) _
Handles SerialPort2.DataReceived

If flg = True Then
Exit Sub
End If

flg = True

'データ受信用のバイト配列
Dim inByte2(SerialPort2.BytesToRead - 1) As Byte

'データの読み込み
SerialPort2.Read(inByte2, 0, SerialPort2.BytesToRead) ←①

'読み込んだデータを改行を確認しながらジェネリクスに移す
For i As Integer = 0 To inByte2.Length - 1

lByte2.Add(inByte2(i)) 'ジェネリクスに足しこむ

'改行が有った
'If lByte2.Count > 2 AndAlso lByte2(lByte2.Count - 2) = 13 AndAlso lByte2(lByte2.Count - 1) = 10 Then
If lByte2.Count > 2 AndAlso lByte2.Count = 8 Then ←②

'ジェネリクスからByte配列に移す
Dim tmpByte2(lByte2.Count - 1) As Byte
For j As Integer = 0 To lByte2.Count - 1
tmpByte2(j) = lByte2(j)
Next

lByte2.Clear() 'ジェネリクスをクリアー

'Shift-Jisからユニコードに変換
Dim uniByte2() As Byte = Encoding.Convert(encSjis2, encUni2, tmpByte2)

'Unicodeの配列から文字列に変換
Dim uniString2 As String = encUni2.GetString(uniByte2)

'メインスレッドのテキストに追加する
Me.Invoke(New dlgAddText2(AddressOf AddText2), New Object() {uniString2})

End If
Next

flg = False
End Sub

4igoten:2010/02/16(火) 15:09:32
Byteで取得していますから改行は関係ないかと。
配列を宣言した時と実際に使う時で長さが変わってきているのかも。
読み込みの長さの取得は一回としてみましょう。

Dim LenBytesToRead As Integer = SerialPort1.BytesToRead - 1
Dim ReadBuff(LenBytesToRead) As Byte
SerialPort1.Read(ReadBuff, 0, LenBytesToRead)

5たか:2010/02/16(火) 16:13:33
 変更してみたのですが
 何回か受信しただけでも
 以下の部分で異常が起きてしまいます。

 FormatExceptionはハンドルされませんでした。
【入力文字列の形式が正しくありません。】

'メインスレッドのテキストに追加する
Me.Invoke(New dlgAddText2(AddressOf AddText2), New Object() {uniString2})


新着レスの表示


名前: E-mail(省略可)

※書き込む際の注意事項はこちら

※画像アップローダーはこちら

(画像を表示できるのは「画像リンクのサムネイル表示」がオンの掲示板に限ります)

掲示板管理者へ連絡 無料レンタル掲示板