2016-10-07 42 views
0

我正在向Lector设备发送数据。 通常,当我在hercules上发送信息时,我收到来自设备的数据。 大力士正在返回“sRA eExtIn1 0 0 0”。 以下代码具有等待行stream.Read()的功能。 如何从设备获取数据?套接字接收数据未到。我在hercules上测试

string responseData = null; 

using (TcpClient client = new TcpClient("10.1.13.102", 2111)) 
{ 
    using (NetworkStream stream = client.GetStream()) 
    { 
     byte[] sentData = System.Text.Encoding.ASCII.GetBytes("<STX>sRN eExtIn1<ETX>"); 
     stream.Write(sentData, 0, sentData.Length); 

     byte[] buffer = new byte[32]; 
     int bytes; 
     if (client.Connected) 
     { 
     while ((bytes = stream.Read(buffer, 0, buffer.Length)) != 0) 
     { 
      for (int i = 0; i < bytes; i++) 
      { 
       responseData += (char)buffer[i]; 
      } 
     } 
     } 
    } 
} 
+1

无关,但如果您所做的任何文档都告诉您发送STX/ETX,它们很可能意味着发送字节0x2/0x3而不是字符串。 –

+0

你不是在等待回应。你假设1)回应将立即到来,2)你会一次收到全部答复。这两个假设都无效。您需要循环读取并继续阅读,直到您拥有完整的预期长度。您可能会在循环中需要一些超时逻辑。 –

回答

0

的错误,你正在做,和对方的回答也正在,是假设stream.Read将不会返回,直到它读取32个字节。这是不正确的。

https://msdn.microsoft.com/en-us/library/system.net.sockets.networkstream.read(v=vs.110).aspx

此方法读取数据到缓冲区参数并返回成功读取 字节数。如果没有数据可用于读取 ,则Read方法返回0. Read操作读取尽可能多的数据,最大数量为 参数指定的字节数。

当没有可用的数据读取或32个字节被读取,会返回,以先到者为准。因此,例如,如果客户端速度较慢或网络非常繁忙,则当您拨打stream.Read时,响应可能尚未到达。因此,将不会有任何内容读取,因此它将返回0,您将退出,无法读取数据。事实上,如果网络非常饱和并且数据一次只能到达几个字节,您可能必须多次拨打stream.Read才能获得完整的32个字节(不可能有这么小的数据包,但必须对其进行编码那样)。

所以,你的代码需要像这样(注意额外while循环):

using (TcpClient client = new TcpClient("10.1.13.102", 2111)) 
{ 
    using (NetworkStream stream = client.GetStream()) 
    { 
     byte[] sentData = System.Text.Encoding.ASCII.GetBytes("<STX>sRN eExtIn1<ETX>"); 
     stream.Write(sentData, 0, sentData.Length); 

     byte[] buffer = new byte[32]; 
     int bytes; 
     if (client.Connected) 
     { 
     int bytesRead = 0; 
     while (bytesRead < buffer.Length) 
     { 
      while ((bytes = stream.Read(buffer, 0, buffer.Length)) != 0) 
      { 
       for (int i = 0; i < bytes; i++) 
       { 
        responseData += (char)buffer[i]; 
       } 
       bytesRead += bytes; 
      } 
     } 
     } 
    } 
} 
0

谢谢大家。 我找到了我的问题的解决方案。 和标签应该描述为字节。如下所示。

byte[] byt = System.Text.Encoding.ASCII.GetBytes("sRN DItype"); 
        stream.Write(STX, 0 , 1); 
        stream.Write(byt, 0, byt.Length); 
        stream.Write(ETX, 0, 1); 
         stream.Read(buffer, 0, buffer.Length);