【发布时间】:2021-04-11 00:49:36
【问题描述】:
我创建了从传感器接收数据(大约 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();
}
【问题讨论】:
-
我假设有问题的传感器仅在询问时给出读数(它不缓冲?),如果是这样,您需要一个专用于以固定间隔读取并缓冲结果,以及专用于按计划或以阈值读数发送缓冲结果的结果。您需要代表传感器缓冲数据。
-
是的,传感器仅在询问时读取。所以我必须创建两个不同的线程。第一个必须负责读取数据,第二个负责发送?
-
@Charleh 谢谢你的回答我创建了两个不同的线程。我添加了我的新代码作为编辑。你能解释一下我现在做错了什么吗?如何同步这些线程?