Я реализую функцию, которая получает данные через 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
,
ИМХО, ты должен изменить архитектуру вашей программы. Здесь много дыр.
return
? Перепишите свой код.Надеюсь, эти советы будут вам полезны! Удачи!
Других решений пока нет …