我正在为生产线编写一些代码。特别是我需要将一些条形码阅读器集成到该行中。
由于许多(错误的)原因,我不得不像你将要看到的那样结束。 此外,在我写这篇文章时,我是那个领域的新手。
问题:有时,读者会读取代码(并通过ftp发送图像),但我的软件中没有数据,我需要了解原因。
这是如何初始化我的阅读器(我有多个阅读器,每个阅读器具有不同的IP但相同的端口)
server = new TcpListener(IPAddress.Any, scannerPort);
server.Start();
Thread thread = new Thread(() =>
{
log.Debug("Waiting for scanner connection");
server.BeginAcceptTcpClient(HandleAsyncConnection, server);
});
thread.Start();
这是我的主要方法:
try
{
object _lockObj = new object();
using (TcpClient client = server.EndAcceptTcpClient(res))
{
int i;
server.BeginAcceptTcpClient(HandleAsyncConnection, server);
string address = client.Client.RemoteEndPoint.ToString();
string senderIp = address.Split(':')[0];
NetworkStream stream = client.GetStream();
Byte[] bytes = new Byte[2048];
while ((i = stream.Read(bytes, 0, bytes.Length)) != 0)
{
log.Debug("Start");
lock (_lockObj)
{
log.Debug("Lock");
StringBuilder sb = new StringBuilder(string.Empty);
string rawCode = string.Empty;
bool isCrFound = false;
foreach (byte c in bytes.Where(x => x != 0))
{
if (c != (char)13 && !isCrFound)
{
if (c == (char)29)
{
sb.Append("<GS>");
}
else
sb.Append(Convert.ToChar(c));
}
else
{
isCrFound = true;
}
}
rawCode = sb.ToString();
log.Debug("Raw code from {0} -> {1}", senderIp, rawCode);
if (rawCode.StartsWith("ERROR", StringComparison.InvariantCultureIgnoreCase))
{
log.Debug("Operator - Errore reading code {0} from {1}", rawCode, senderIp);
}
else
{
//Process code
}
log.Debug("End");
}
log.Debug("Unlock");
}
}
}
catch (Exception ex)
{
log.Error("Error on the async connect operation: {0}, Stack: {1}", ex.Message, ex.StackTrace);
}
所以基本上每次传感器触发时,数据都会发送到我的套接字。 这很好用,直到线开始加速(如3/4码/秒);那就是数据丢失发生的时候。
现在,我不知道问题出在哪里。可能是devide,我的实现,资源管理(字节数组是1024,我仍然要尝试2048) 任何帮助将不胜感激。
由于
编辑:
丢失的代码不会在我的日志中留下任何痕迹......所以我不认为它与丢弃的数据有关。
我想知道在我这样的环境中是否有办法更好地完成这类工作。