2014-01-09 5 views
0

Я непрерывно отправляю массивы значений пикселей (160x120) в качестве байтового потока из LabVIEW в C-программу через TCP/IP. Затем я конвертирую байты в значения uint32 и печатаю полученные данные в консольном приложении. Цель здесь состоит в том, что я хочу разделить полученные данные в массивах 1D, поэтому каждый 1D-массив будет состоять из (160x120 = 19200) целых значений, поэтому он представляет собой фрейм. В лучшем случае массив должен собирать каждые 19200 целых чисел полученных данных и отображать их в консольном приложении. Затем тот же массив должен собирать следующие целые числа 19200 и отображать их в консольном приложении и так далее. Я ценю, если кто-нибудь покажет, как это сделать.1D массивы uint32 в C

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 i; 
size_t len; 
uint32_t* p; 
uint32_t value; 

p = (uint32_t*)((void*)recvbuf); 

do 
{ 
    iResult = recv(new_socket, recvbuf, recvbuflen, 0); 
    len = iResult/sizeof(uint32_t); 

    for(i=0; i < len; i++) 
    { 
    value = p[i]; 
    } 
    printf("%d\n", value); 

} 
while (iResult > 0); 

closesocket(new_socket); 
WSACleanup(); 

return 0; 
+2

Я не знаю, имеет ли смысл сбросить содержимое изображения на консоль, но вы должны «printf» каждое значение не только последним. – harper

+0

Если вы отправляете пиксельные значения изображения, почему бы не отобразить изображение? Какой смысл сбрасывать каждый 4 пикселя в виде целого числа? Какой тип данных вашего изображения? – dousin

+0

Minor: Подозреваемый в исключительных случаях 'p [i]' является проблемой, поскольку буфер 'recvbuf' имеет выравнивание' char', но используется с выравниванием 'uint32_t'. Лучше объявить буфер как 'uint32_t recvbuf [tbd]'. Также используйте 'printf ("% "PRIu32" \ n ", value)' или 'printf ("% lu \ n ", (unsigned long) значение)'. – chux

ответ

0

Этот код делает много предположений о размерах и расстановке предметов. В системах x86 это будет работать нормально, но остерегайтесь систем, требующих выравнивания. Предполагается также, что обе системы имеют одинаковую эндемичность.

Для получения данных разбит на 160x120 uint32_t байт куски (если ваш DEFAULT_BUFLEN правильно):

int receivedCount = 0; 
do 
{ 
    iResult = recv(new_socket, 
        &recvbuf[receivedCount], 
        DEFAULT_BUFLEN-receivedCount, 
        0); 
    if (iResult == 0) break; //0 == socket closed 
    receivedCount += iResult; 
    if (receivedCount < DEFAULT_BUFLEN) 
     continue;     //still receiving full frame 
    for(int i=0; i<160*120; i++) 
     printf("%d\n",(unsigned int)p[i]); 
    receivedCount = 0; 
} 
while(wantToContinueCapturingFrames); 

это будет постоянно ждать данных, пока полный кадр не был получен. Как только будет получен полный кадр, он распечатает данные из фрейма. Если удаленная система закрывает соединение, это приведет к выходу без печати частичного кадра.

Этого не достаточно для «реальных» приложений, поскольку он блокирует recv, ожидая данных. Не существует никаких условий (изящно) прерывать без удаленной системы либо отправку данных, либо закрытие соединения, но исправление, на самом деле это не то, о чем вы просите здесь.

+0

Спасибо за ответ. 1. Как вы объявляете полученный счет? 2. Почему вы объявляете неподписанный символ «done» и не используете его? –

+0

отредактирован, хотя оба ответа должны быть достаточно очевидными. Я просто забыл удалить переменную «done», как только я добрался до сути и не нуждался в ней. receivedCount будет такого же типа, как iResult. – Speed8ump

+0

Код отображает некоторые нули в консольном приложении и затем прекращает работу из-за ошибки в строке: printf ("% d \ n", (unsigned int) p [i]); Необработанное исключение в 0x01271729 в ​​файле consoleapplication1.exe: 0xC0000005: Место обнаружения нарушения доступа 0x00330000. Значения «i» и «p» отмечены красным цветом, поэтому возникает ошибка –

Смежные вопросы