У меня проблема со считыванием данных с RFID-считывателя. Я подключаюсь к считывателю по tcp и жду, пока DataAvailable будет истинным, затем читаю данные, пока не получу символ конца данных. Затем я просто возвращаюсь и жду нового DataAvailable. Это делается в собственном потоке для функции.
Кажется, есть какой-то тайм-аут. Если я не получу никаких данных через пару минут, то они просто будут сидеть в цикле выполнения/цикла, ожидая DataAvailable. Подношу карту к считывателю RFID, он пищит, но данных нет. Я не получаю никаких исключений, и в информации говорится, что clientsocket все еще подключен. Есть ли что-нибудь еще, что я могу проверить?
Если я поднесу карту к считывателю через минуту, то этого, кажется, никогда не произойдет. Таким образом, 2-3 минуты простоя, кажется, делают это.
Вот мой код для чтения данных из сокета, я убрал ненужный код:
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
Thread.Sleep(int)
перед закрытием внешнего цикла. Возможно, установите его для100
или250
. В противном случае вы вращаетесь по очень узкому кругу, тратя впустую циклы процессора. Этот внешний цикл может фактически работать со скоростью сотни в миллисекунду. - person Chris Haas   schedule 24.03.2011