我不断通过TCP / IP将分辨率为160x120的LabVIEW的像素值(uint32)二维数组发送到C程序。 C程序的目的是在控制台应用程序中将接收的像素值显示为2D数组。我将像素作为字节流发送,并使用Ws2_32.lib中的recv函数接收C程序中的字节。然后我将字节转换为uint32值并使用2D数组在控制台应用程序中显示它们,因此每个2D数组都代表一个图像。
我遇到了帧速率问题。我可以在LabVIEW中每秒发送30帧,但是当我用C程序打开TCP / IP连接时,帧速率下降到每秒1帧。这一定是C程序的一个问题,因为我设法用相同的LabVIEW程序将每秒所需的帧发送到相应的C#程序。
C代码:
#define DEFAULT_BUFLEN 256
#define IMAGEX 120
#define IMAGEY 160
WSADATA wsa;
SOCKET s , new_socket;
struct sockaddr_in server , client;
int c;
int iResult;
char recvbuf[DEFAULT_BUFLEN];
int recvbuflen = DEFAULT_BUFLEN;
typedef unsigned int uint32_t;
unsigned int x=0,y=0,i,n;
uint32_t image[IMAGEX][IMAGEY];
size_t len;
uint32_t* p;
p = (uint32_t*)recvbuf;
do
{
iResult = recv(new_socket, recvbuf, recvbuflen, 0);
len = iResult/sizeof(uint32_t);
for(i=0; i < len; i++)
{
image[x][y] = p[i];
x++;
if (x >= IMAGEX)
{
x=0;
y++;
}
if (y >= IMAGEY)
{
y = 0;
x = 0;
//print image
for (n=0; n< IMAGEX*IMAGEY; n++)
{
printf("%d",image[n%IMAGEX][n/IMAGEY]);
if (n % IMAGEX)
{
printf(" ");
}
else
{
printf("\n");
}
}
}
}
} while ( iResult > 0 );
答案 0 :(得分:1)
尝试减少打印。由于您正在同一个线程中读取和打印,TCP连接中的数据将填满,然后它将向另一端(LABView)施加压力,LABView将停止发送数据,直到它从另一端获得绿色信号(你是C程序)
首先,您可以通过替换此
进行调试 for (n=0; n< IMAGEX*IMAGEY; n++)
{
printf("%d",image[n%IMAGEX][n/IMAGEY]);
if (n % IMAGEX)
{
printf(" ");
}
else
{
printf("\n");
}
}
与 printf(“One frame recv \ n”);
看看它是否有任何区别。我假设你的tcp连接有足够的带宽
答案 1 :(得分:0)
如果没有进一步的信息,很难诊断出来。不过,我可以提出一些建议。
首先,你的recv调用是使用一个小缓冲区,所以你花了很多时间来调用它。为什么不一次读一整帧?此外,您读入数据,然后将其复制到图像阵列。使用图像阵列本身不是更简单吗?结合这两个建议可以将整个帧直接读入图像数组,从而节省了大量时间。
问题的另一个原因可能是控制台。使用您提供的示例代码,您尝试每秒向终端写入30 * 120 * 160 = 57,600个整数值。如果带有分隔符的平均值占用8个字符,则为每秒400万个字符。完全有可能显示器不能那么快,在这种情况下,事情会备份并减慢一直到服务器写入套接字。 有几种方法可以解决这个问题,但是进入这里太过分了。