помогите советом.читаю данные с ком порта с помощью read
в main() все работает.
но если я пытаюсь прочитать точно также в другой функции или в созданном потоке то ничего не прочитывается. само собой передавал номер файла в аргументе, пробовал сделать все переменные глобальными. но не в потоме не просто в вызванной функции ничего с порта не читается.
вот функция потока
-------------------------------------------------
void * read_thread_function (void *arg)
{
int rb;
char *rbuf;
int i;
while (1)
{
rb = read (fd, rbuf);
printf ("\nread %i bytes\n",rb);
for (i=0;i<rb;i++) putchar (rbuf[i]);
sleep (1);
}
return;
}
-----------------------------------------------получается: read 0 bytes
точно такой же код в функции main работает как надо.
А как передаётся fd? Собственно arg и д.б. указатель на fd, а потом его нужно привести к нужному типу и использовать в read.
>А как передаётся fd? Собственно arg и д.б. указатель на fd, а
>потом его нужно привести к нужному типу и использовать в read.
>а по моему это хорошо что считываются всего 0 байтов, потому что если считать чуть больше то будет какая нибудь фигня типа срыва стека или еще чего нибудь.
нельзя же считывать что то из файла, в неинициализированный буфер
>>А как передаётся fd? Собственно arg и д.б. указатель на fd, а
>>потом его нужно привести к нужному типу и использовать в read.
>>
>
>а по моему это хорошо что считываются всего 0 байтов, потому что
>если считать чуть больше то будет какая нибудь фигня типа срыва
>стека или еще чего нибудь.
>нельзя же считывать что то из файла, в неинициализированный буфернепонимаю, про какой буфер идет речь? может напишешь код?
>А как передаётся fd? Собственно arg и д.б. указатель на fd, а
>потом его нужно привести к нужному типу и использовать в read.
>да, именно так и делал, передавал указатель на fd, но не работает всеравно, пробовал и через глобальную переменную тоже не работает. заметил, что если в функции main не трогать порт вобще а открывать его в потоке то работает, но это не подхлодит. наверное надо передать еще какие-то указатели...
>в main() все работает.
>
>но если я пытаюсь прочитать точно также в другой функции или в
>созданном потоке то ничего не прочитывается.Покажи, как COM инициализируешь. В свое время сам на подобные грабли наступал. Делал все по извесной доке, а в ней ошибка присутствует. :( Там в одном месте '&' не хватает.
всем большое спасибо, разобрался в чем дело.
когда передаеш функции указатель на int и пытаешся использовать именно ту переменную через указатель то, не работет.
если записать содержимое в отдельную переменную то работает.
но при условии, что опции порта доступны.
те структура termios должна быть тоже доступна.
можно получить на нее указатель, или просто объявить как глобальную переменную.
:)
вообще не понимаю как трид может видеть что то кроме аргумента в него переданного. Если надо создавай структуру, передавай на неё указатель,разыменовывай и используй.
то есть видеть то он может но Вам тогда надо почитать про мютексы и семафоры
В приведённом выше куске кода, как вам уже писали, вы пытаетесь читать данные неизвестно куда (указатель rbuf не проинициализирован). К тому же не указывая, сколько читать (фактически, произвольное количество). Так что если у вас используется именно такой код, то его работа - чистое совпадение и он ещё неоднократно будет то работать, то вдруг нет.man read(2)