【发布时间】:2017-09-18 23:27:27
【问题描述】:
我有一个条形码扫描仪硬件设备,它不断扫描经过的条形码并通过它的 tcpip 端口发送数据。扫描仪安装在生产线上,读取所有通过的条形码以进行验证。除了在连接时可能通过 NetworkStream 类发送的信息之外,没有任何信息发送到条形码扫描仪。我实现了一个非常简单的接口来验证设备发送的预期数据的连接和接收。显然,这段代码的问题是它只迭代了一定次数。无论循环选择如何,我都需要一个接收数据并继续接收数据的应用程序,直到我的代码选择停止关闭连接并停止接收数据。它必须始终监视端口以获取来自设备的 tcp ip 服务器的传入数据。
public void readData()
{
int n = 1;
Byte[] data;
Int32 port = 51236;
TcpClient client = new TcpClient("192.168.0.70", port);
NetworkStream stream = client.GetStream();
String responseData = String.Empty;
try
{
while (n < 50)
{
data = new Byte[256]; //arbitrary length for now
// String to store the response ASCII representation.
// Read the first batch of the TcpServer response bytes.
Int32 bytes = stream.Read(data, 0, data.Length);
responseData = System.Text.Encoding.ASCII.GetString(data, 0, bytes);
m_upcCode = responseData;
n++;
}
}
catch (ArgumentNullException ArgEx)
{
m_upcCode = "ArgumentNullException: {0}" + ArgEx.Message.ToString();
}
catch (SocketException exSocket)
{
m_upcCode = "SocketException: {0}" + exSocket.Message.ToString();
}
}
我一直在浏览许多关于建立与 tcp ip 服务器的连接并从服务器接收数据的帖子。我发现最有希望的帖子可能是Can a TCP c# client receive and send continuously/consecutively without sleep?。我只是在理解如何实现设计时遇到问题。我很高兴看到该帖子中的代码在表单上简单地调用和实现,并在文本框中显示数据。接收的数据始终是固定长度的 12 位条形码和 .除非传送带停止,否则数据不会停止。但是我们不希望仅仅因为线路暂停而关闭连接。 C# TCP Client listening for data 也有一个帖子,专门尝试解决读取条形码的问题,但没有得到太多回应。
【问题讨论】:
-
这里的答案似乎与您的尝试接近:stackoverflow.com/questions/21600011/…
-
这个 API 的文档似乎很差。据称
NetworkStream执行阻塞 I/O,这意味着它的read()方法不应该返回,直到至少有一些 数据可用,或者出现错误 -但错误的可能性似乎是由异常处理的。目前还不清楚是什么导致 read() 返回正值以外的任何内容。如果这实际上是一个合法的阻塞读取,那么您需要做的就是调用它,让系统休眠(即阻塞)您的程序,直到一些数据可用,使用该数据,然后重复直到完成或出现异常.
标签: c# barcode-scanner tcp-ip hardware-interface