Заполните массив перед выпуском данных

Я реализую функцию, которая получает данные через Bluetooth и возвращает их в массиве unsigned char buf[10], Это моя функция, которая вызывается каждые х миллисекунд через QTimer:

void gui::listen_device()
{
unsigned char crcval;

int count = 0;

fd_set readmask;
struct timeval tv;

int v = 0, v1 = 0, v2 = 0;

tv.tv_sec = 0;
tv.tv_usec = 100000;

int i;
memset (buf, 0, 10);
FD_ZERO (&readmask);
FD_SET (sock, &readmask);
if (select (255, &readmask, NULL, NULL, &tv) > 0)
{
if (FD_ISSET (sock, &readmask))
{
numb = read (sock, buf, 10);

// print of counter
printf ("%d ->", buf[0]);
fprintf (data, "%d,", buf[0]);
for (i = begin; i < numb-1; i++)
{
v = buf[i];
printf ("%d,", v);
fprintf (data, "%d,", v);
}

//---------------//
crcval = BP_CRC8(buf,9);
printf(" crcf=%x crcc=%x", buf[9], crcval);
if (crcval == buf[9])
{
printf("crc ok\n");
begin = 1;
}
else
{
printf("crc fail\n");
begin = numb -1;
}
//---------------//

printf ("\n");
fprintf (data, "\n");
}
}
}

Я хочу, чтобы функция вернулась buf только если он полон. Итак, я создал глобальную переменную begin если buf не был заполнен в последний раз, когда таймер пришел.

Это выход в .txt файл.

0,0,0,0,0,0,0,0,0,
1,0,0,0,0,0,0,0,0,
2,0,0,0,0,0,0,0,0,
3,0,0,0,0,0,0,0,0,
4,0,0,0,0,0,0,
0,
5,0,0,0,0,0,0,0,0,
6,0,0,0,0,0,0,0,0,
7,0,0,0,0,0,0,0,0,
8,0,0,0,0,0,0,0,0,
9,0,0,
0,0,0,
10,0,0,0,0,
11,0,0,0,0,0,0,0,0,
12,0,0,0,0,0,0,0,0,
13,0,0,0,0,0,0,0,0,
14,0,0,0,0,0,0,0,0,
15,0,0,0,0,0,0,0,0,
16,0,0,0,0,0,0,0,0,

время от времени это возвращает меня неполным buf,

0

Решение

ИМХО, ты должен изменить архитектуру вашей программы. Здесь много дыр.

  • Вы вызываете некоторую функцию каждые x миллисекунд, и где есть гарантия, что это будет сделано, когда произойдут следующие x миллисекунд.
  • Вы запускаете свое прослушивание с графического интерфейса, поэтому ваш графический интерфейс ожидает и не перерисовывает здесь. Сделай это в фоновом режиме.
  • Если вы говорите, что функция возвращает что-то — где ваш return? Перепишите свой код.

Надеюсь, эти советы будут вам полезны! Удачи!

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]