URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 6833
[ Назад ]

Исходное сообщение
"потоки и чтение порта"

Отправлено bopurod , 12-Окт-07 15:23 
помогите советом.

читаю данные с ком порта с помощью 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 работает как надо.


Содержание

Сообщения в этом обсуждении
"потоки и чтение порта"
Отправлено tux2002 , 12-Окт-07 15:38 
А как передаётся fd? Собственно arg и д.б. указатель на fd, а потом его нужно привести к нужному типу и использовать в read.


"потоки и чтение порта"
Отправлено NuINu , 12-Окт-07 16:11 
>А как передаётся fd? Собственно arg и д.б. указатель на fd, а
>потом его нужно привести к нужному типу и использовать в read.
>

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


"потоки и чтение порта"
Отправлено bopurod , 12-Окт-07 16:13 
>>А как передаётся fd? Собственно arg и д.б. указатель на fd, а
>>потом его нужно привести к нужному типу и использовать в read.
>>
>
>а по моему это хорошо что считываются всего 0 байтов, потому что
>если считать чуть больше то будет какая нибудь фигня типа срыва
>стека или еще чего нибудь.
>нельзя же считывать что то из файла, в неинициализированный буфер

непонимаю, про какой буфер идет речь? может напишешь код?


"потоки и чтение порта"
Отправлено bopurod , 12-Окт-07 16:11 
>А как передаётся fd? Собственно arg и д.б. указатель на fd, а
>потом его нужно привести к нужному типу и использовать в read.
>

да, именно так и делал, передавал указатель на fd, но не работает всеравно, пробовал и через глобальную переменную тоже не работает. заметил, что если в функции main не трогать порт вобще а открывать его в потоке то работает, но это не подхлодит. наверное надо передать еще какие-то указатели...


"потоки и чтение порта"
Отправлено Sot , 12-Окт-07 16:24 
>в main() все работает.
>
>но если я пытаюсь прочитать точно также в другой функции или в
>созданном потоке то ничего не прочитывается.

Покажи, как COM инициализируешь. В свое время сам на подобные грабли наступал. Делал все по извесной доке, а в ней ошибка присутствует. :( Там в одном месте '&' не хватает.


"потоки и чтение порта"
Отправлено bopurod , 12-Окт-07 16:55 
всем большое спасибо, разобрался в чем дело.
когда передаеш функции указатель на int и пытаешся использовать именно ту переменную через указатель то, не работет.
если записать содержимое в отдельную переменную то работает.
но при условии, что опции порта доступны.
те структура termios должна быть тоже доступна.
можно получить на нее указатель, или просто объявить как глобальную переменную.
:)

"потоки и чтение порта"
Отправлено tux2002 , 12-Окт-07 20:50 
вообще не понимаю как трид может видеть что то кроме аргумента в него переданного. Если надо создавай структуру, передавай на неё указатель,разыменовывай и используй.

"потоки и чтение порта"
Отправлено tux2002 , 12-Окт-07 21:02 
то есть видеть то он может но Вам тогда надо почитать про мютексы и семафоры

"потоки и чтение порта"
Отправлено jd , 12-Окт-07 21:03 
В приведённом выше куске кода, как вам уже писали, вы пытаетесь читать данные неизвестно куда (указатель rbuf не проинициализирован). К тому же не указывая, сколько читать (фактически, произвольное количество). Так что если у вас используется именно такой код, то его работа - чистое совпадение и он ещё неоднократно будет то работать, то вдруг нет.

man read(2)