我试图通过TCP套接字从运行Blackfin533处理器的嵌入式设备转储数据,并将其绘制在我的计算机上运行的Win Forms程序中。
以下C ++代码在嵌入式设备上运行,并按预期工作:
while(1)
{
UpdateDataArray();
int sent = send(m_Socket, (UINT8 *)dataArray, 10000, 0);
if(sent <= 0)
break;
}
我的客户端程序不断接收和绘制数据。收到数据并且每隔约7ms更新一次图。到目前为止一切都很好。
现在,如果不是仅仅转储数据,我希望客户端必须通过发送字符串&#34; Next&#34;来请求发送新数组。每次迭代:
while(1)
{
int recvLen = recv(m_Socket, (char *)dataInArray, 513, 0);
if(recvLen <= 0)
break;
if(!ReceivedCommand("Next"))
break;
UpdateDataArray();
int sentLen = send(m_Socket, (char *)dataOutArray, 10000, 0);
if(sentLen <= 0)
break;
}
现在突然刷新率大约是210ms!我怀疑这可能与MTU大小为1500字节有关,果然,如果我只发送1400字节而不是10000字节,则刷新率降至1毫秒。在1500字节时,它再次上升到210ms。
为什么数据在第一种情况下以7ms传输,但在第二种情况下传输时间是30倍?
编辑:在运行wireshark之后,很明显延迟发生在接收计算机上,而不是嵌入式设备上。
服务器发送1400字节包:
服务器发送1500字节包:
这是客户端接收数据的方式:
while(1)
{
refreshRateStopWatch.Start();
byte[] msg = Encoding.ASCII.GetBytes("Next");
int bytesSent1 = senderSock.Send(msg);
if (bytesSent1 == 0)
{
return;
}
int bytesRec1 = senderSock.Receive(bytes);
if (bytesRec1 == 0)
{
return;
}
refreshRateStopWatch.Stop();
refreshRate = refreshRateStopWatch.ElapsedMilliseconds;
refreshRateStopWatch.Reset();
Plot(bytes);
}