我创建了从传感器接收数据(大约 80k 样本/秒)并通过 TCP/IP 将它们发送到我的 PC 应用程序的设备。问题是有时我的设备会丢失一些数据。我想这是因为当我通过 TCP/IP 处理器发送数据时需要一些时间来做到这一点,然后他有一段时间没有从传感器接收数据。我注意到当我在发送之前收集一些数据时,它发生的频率较低,所以我在 data.Length 大于 30000 时发送数据。感谢您的建议。有我的服务器代码:
while (true)
{
if (ClientIsConnected==1)
{
value = Convert.ToString(sensor1.Read(0)); ; // Publish the return value
DateTime currentDate = DateTime.Now;
long elapsedTicks = currentDate.Ticks - startDate.Ticks;
TimeSpan elapsedSpan = new TimeSpan(elapsedTicks);
time = Convert.ToString(elapsedTicks / 100);
data.Append("[" + value + " " + time + "]" + "/n");
if (data.Length > 30000)
{
serverTcp.Send(socket, Convert.ToString(data));
data.Clear();
}
}
}
编辑两个不同的线程代码:
object msg = null;
if (ClientIsConnected==1)
{
var threadTcp = new Thread(() =>
{
server.Send(socket, Convert.ToString(data));
});
var threadReadAdc = new Thread(() =>
{
value = Convert.ToString(Sensor1.Read(0)); ; // Publish the return value
DateTime currentDate = DateTime.Now;
long elapsedTicks = currentDate.Ticks - startDate.Ticks;
TimeSpan elapsedSpan = new TimeSpan(elapsedTicks);
time = Convert.ToString(elapsedTicks / 100);
data = data.Append("[" + value + " " + time + "]" + "\n");
if (data.Length > 30000)
{
msg = Convert.ToString(data);
data.Clear();
}
});
threadReadAdc.Start();
threadTcp.Start();
}
我会BlockingCollection<string>
在这里使用类似的东西
您可以设置一个字符串集合,在一个线程中写入该集合并在另一个线程中读取。读取可以将结果存储在缓冲区中,并在缓冲区足够满时通过 TCP 发送(或已经过去了足够的时间 - 这取决于您)。
阻塞集合是线程安全的,读取将阻塞,直到有东西要读取。
例如
var data = new BlockingCollection<string>();
Task taskWrite = Task.Run(() =>
{
while(true)
{
var sensorReading = Convert.ToString(sensor1.Read(0)); // Do your string time/formatting here too - I left it off for clarity
data.Add(sensorReading);
}
});
Task taskRead = Task.Run(() => {
var buffer = List<string>();
while(true)
{
if(buffer.Count > 30000)
{
// Grab contents of buffer and send via TCP
server.Send(socket, String.Join("\n", buffer));
buffer.Clear();
}
else
{
// Consume the next sensor value from the collection
buffer.Add(data.Take());
}
}
});
如果您想确保不会用值填满内存(例如,如果您的读取速度比写入速度快得多),您还可以在阻塞集合上设置边界。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句