2

RFIDリーダーからのデータの読み取りに問題があります。tcpでリーダーに接続し、DataAvailableがtrueになるのを待ってから、データ文字の終わりを取得するまでデータを読み取ります。次に、戻って新しいDataAvailableを待ちます。これは、関数の独自のスレッドで実行されます。

ある種のタイムアウトがあるようです。数分以内にデータが取得されない場合は、データがDataAvailableを待機しているdo/loopにあります。カードをRFIDリーダーにかざすと、ビープ音が鳴りますが、利用できるデータがありません。例外は発生しません。情報によると、クライアントソケットはまだ接続されています。他に確認できることはありますか?

カードを1分間隔でリーダーに置くと、これは決して起こらないようです。したがって、2〜3分のアイドル状態:ingがこれを行うようです。

ソケットからデータを読み取るための私のコードは次のとおりです。無関係なコードをいくつか削除しました。

Sub test(ByVal ip As String, ByVal port As Integer)
    ' this sub is meant to run forever
    Try
        Dim clientSocket As New System.Net.Sockets.TcpClient()
        clientSocket.Connect(ip, port)
        Using serverStream As NetworkStream = clientSocket.GetStream()
            Do 'loop forever or until error occur

                'Every new dataentry starts here
                Dim inStream(0) As Byte
                Dim returndata As String = ""

                Do 'loop forever 
                    Do Until serverStream.DataAvailable 'loop until data exists to read
                        If clientSocket.Connected = False Then

                            'this will never happen.
                            'but if there are more than 5 minutes between data then
                            'it never got data again as if no data was sent.

                            Exit Sub
                        End If
                        Application.DoEvents()
                    Loop

                    'there is data to read, read first byte and 
                    serverStream.Read(inStream, 0, 1)
                    If inStream(0) = 13 Then

                        'got end of data
                        'exit loop if reading chr 13.
                        returndata &= System.Text.Encoding.ASCII.GetString(inStream)
                        Exit Do

                    End If
                Loop

                GotData(returndata)

            Loop
        End Using
    Catch ex As Exception
        ' handle error
    Finally
        'close connection if open
    End Try
End Sub
4

1 に答える 1

2

socket.Connectedは、接続で最後のコマンドが実行されたときのステータスのみを報告することを知りました。したがって、 Do until serverStream.DataAvailableループでは、このトリックを使用して、代わりに接続が閉じられているかどうかを確認しました。

Dim test As Boolean = clientSocket.Client.Poll(10, System.Net.Sockets.SelectMode.SelectRead)
If test = True And serverStream.DataAvailable = False Then
   'restart connection
End If

これで、最終的に何が起こっているかを制御できるようになり、クライアント接続が閉じているためにデータが取得されないことがわかりました。

それで、接続が閉じられていることがわかったので、どうすればそれを防ぐことができるのでしょうか。それは簡単でした。10秒ごとにtcpip-serverにデータを送信するだけで、データは開いたままになります。

私にとってうまくいく結果(これは製品コードではなく、解決策の単なる例です):

    Dim s As Date = Now
    Do Until serverStream.DataAvailable
        Dim r As Boolean = clientSocket.Client.Poll(10, System.Net.Sockets.SelectMode.SelectRead)
        If DateDiff(DateInterval.Second, s, Now) > 10 Then
           Dim dta(0) As Byte
           dta(0) = 0
           clientSocket.Client.Send(dta)
           s = Now
        End If
        If r = True And serverStream.DataAvailable = False Then
             'restart sub
             Exit Sub
        End If
   loop

そのため、今では閉じず、x分ごとに再起動する必要があります。

私の問題は解決され、Imは幸せなコーダーです。;)

于 2011-03-24T14:17:08.137 に答える