LINUX.ORG.RU

Нужна помощь, COM-Port в потоке pthread


0

1

Люди добрые, нужна помощь, в общем картина следующая, есть буфер FIFO, есть ком-порт. Задача хочу запихнуть в поток следующий процесс: читаем буфер FIFO, и если в нем что-то есть, то выкидываем в ком-порт. Проблема собственно вот в чем, когда без потока, то все отлично работает, как только поток, получаю следующиее:

*** buffer overflow detected ***: ./delta terminated ======= Backtrace: ========= /lib/i386-linux-gnu/libc.so.6(__fortify_fail+0x50)[0xb7488df0] /lib/i386-linux-gnu/libc.so.6(+0xe4cca)[0xb7487cca] /lib/i386-linux-gnu/libc.so.6(+0xe42a9)[0xb74872a9] ./delta[0x8048e80] /lib/i386-linux-gnu/libpthread.so.0(+0x5e99)[0xb7636e99] /lib/i386-linux-gnu/libc.so.6(clone+0x5e)[0xb747373e] ======= Memory map: ======== 08048000-0804a000 r-xp 00000000 fb:00 524311 /usr/src/smas/smasclient2/delta/delta 0804a000-0804b000 r--p 00001000 fb:00 524311 /usr/src/smas/smasclient2/delta/delta 0804b000-0804c000 rw-p 00002000 fb:00 524311 /usr/src/smas/smasclient2/delta/delta 08f14000-08f35000 rw-p 00000000 00:00 0 [heap] b6b8a000-b6b8b000 ---p 00000000 00:00 0 b6b8b000-b738d000 rw-p 00000000 00:00 0 b738d000-b73a0000 r-xp 00000000 fb:00 30015724 /lib/i386-linux-gnu/libz.so.1.2.3.4 b73a0000-b73a1000 r--p 00012000 fb:00 30015724 /lib/i386-linux-gnu/libz.so.1.2.3.4 b73a1000-b73a2000 rw-p 00013000 fb:00 30015724 /lib/i386-linux-gnu/libz.so.1.2.3.4 b73a2000-b73a3000 rw-p 00000000 00:00 0 b73a3000-b74fd000 r-xp 00000000 fb:00 30015505 /lib/i386-linux-gnu/libc-2.13.so b74fd000-b74fe000 ---p 0015a000 fb:00 30015505 /lib/i386-linux-gnu/libc-2.13.so b74fe000-b7500000 r--p 0015a000 fb:00 30015505 /lib/i386-linux-gnu/libc-2.13.so b7500000-b7501000 rw-p 0015c000 fb:00 30015505 /lib/i386-linux-gnu/libc-2.13.so b7501000-b7504000 rw-p 00000000 00:00 0 b7504000-b751e000 r-xp 00000000 fb:00 30015532 /lib/i386-linux-gnu/libgcc_s.so.1 b751e000-b751f000 r--p 00019000 fb:00 30015532 /lib/i386-linux-gnu/libgcc_s.so.1 b751f000-b7520000 rw-p 0001a000 fb:00 30015532 /lib/i386-linux-gnu/libgcc_s.so.1 b7520000-b7544000 r-xp 00000000 fb:00 30015527 /lib/i386-linux-gnu/libm-2.13.so b7544000-b7545000 r--p 00023000 fb:00 30015527 /lib/i386-linux-gnu/libm-2.13.so b7545000-b7546000 rw-p 00024000 fb:00 30015527 /lib/i386-linux-gnu/libm-2.13.so b7546000-b7625000 r-xp 00000000 fb:00 28840432 /usr/lib/i386-linux-gnu/libstdc++.so.6.0.14 b7625000-b7629000 r--p 000de000 fb:00 28840432 /usr/lib/i386-linux-gnu/libstdc++.so.6.0.14 b7629000-b762a000 rw-p 000e2000 fb:00 28840432 /usr/lib/i386-linux-gnu/libstdc++.so.6.0.14 b762a000-b7631000 rw-p 00000000 00:00 0 b7631000-b7646000 r-xp 00000000 fb:00 30015523 /lib/i386-linux-gnu/libpthread-2.13.so b7646000-b7647000 r--p 00015000 fb:00 30015523 /lib/i386-linux-gnu/libpthread-2.13.so b7647000-b7648000 rw-p 00016000 fb:00 30015523 /lib/i386-linux-gnu/libpthread-2.13.so b7648000-b764b000 rw-p 00000000 00:00 0 b764b000-b77ea000 r-xp 00000000 fb:00 28847085 /usr/lib/libmysqlclient.so.16.0.0 b77ea000-b77ed000 r--p 0019e000 fb:00 28847085 /usr/lib/libmysqlclient.so.16.0.0 b77ed000-b7832000 rw-p 001a1000 fb:00 28847085 /usr/lib/libmysqlclient.so.16.0.0 b7832000-b7833000 rw-p 00000000 00:00 0 b7833000-b783a000 r-xp 00000000 fb:00 30015507 /lib/i386-linux-gnu/librt-2.13.so b783a000-b783b000 r--p 00006000 fb:00 30015507 /lib/i386-linux-gnu/librt-2.13.so b783b000-b783c000 rw-p 00007000 fb:00 30015507 /lib/i386-linux-gnu/librt-2.13.so b783f000-b7844000 rw-p 00000000 00:00 0 b7844000-b7845000 r-xp 00000000 00:00 0 [vdso] b7845000-b7861000 r-xp 00000000 fb:00 30015528 /lib/i386-linux-gnu/ld-2.13.so b7861000-b7862000 r--p 0001b000 fb:00 30015528 /lib/i386-linux-gnu/ld-2.13.so b7862000-b7863000 rw-p 0001c000 fb:00 30015528 /lib/i386-linux-gnu/ld-2.13.so bff28000-bff49000 rw-p 00000000 00:00 0 [stack] Аварийный останов

Сам код функции потока: void * cDeltaCom::dcom(void *arg) { int q=0; FILE * f; struct termios opt; struct sDeltaCom *set=(struct sDeltaCom *)arg; cLog log(1,set->LogFile,«SMAS To Delta stack»); log.log(1,«Openning COM-Port: %s»,set->Port); int p; log.log(1,«COM-Port is opened»); umask(0); mknod(set->Fifo,S_IFIFO|0666,0); p=open(set->Port,O_RDWR | O_NOCTTY | O_NDELAY); if (p==-1) { return NULL; } fcntl(p,F_SETFL,0); tcgetattr(p,&opt); opt.c_cflag |=CS8; opt.c_cflag &=~PARENB; opt.c_cflag &=~CSTOPB; opt.c_cflag &=~CRTSCTS; opt.c_cflag |=CREAD; opt.c_cflag |=CLOCAL; opt.c_cflag |=~OPOST; cfsetispeed(&opt,B9600); cfsetospeed(&opt,B9600); tcsetattr(p,TCSAFLUSH,&opt); tcflush(p,TCIOFLUSH); while (1) { unsigned char buf[5]; int tmpnum; int objnum; char *s; char bf[128]=""; int Code=0,Message=0; char tmp[64]=""; f=fopen(set->Fifo,«r»); s=fgets(bf,128,f); bf[strlen(bf)-1]=0; s=strchr(bf,'-'); strncpy(tmp,bf,s-bf); tmp[s-bf]=0; s++; q=write (p,buf,sizeof(buf)-1); int status; ioctl(p,TIOCMGET,&status); status &=~TIOCM_DTR; ioctl(p,TIOCMSET,status); fclose(f); } close(p); }

Пожалуйста, СПАСИТЕ....


Прочитай про LORCODE и оформи сообщение нормально, а там и посмотрим

yoghurt ★★★★★
()

Ты сам эту кашу пробовал читать?

Chaser_Andrey ★★★★★
()

bt после креша в дебагере сделай

mi_estas
()

скомпилируй прогу с дебагом (gcc -g) и лог заново покажи - только нормально покажи

ae1234 ★★
()

Если СИ без плюсов для Вас (Вашей задачи) приемлем, то посмотрите вот это: http://linuxforum.ru/viewtopic.php?id=15759 это насчет инициализации и открытия порта, а затем чтения из порта и записи в порт. И еще: а без нитки-thread можно обойтись, или работа с портом не главная задача? По поводу pthread покажу код чуть позже. Но это в бесконечном цикле чтения с таймером, до нажатия заветной комбинации Ctrl+C

sklimkin
()
Ответ на: комментарий от Harald

>а так правильно - «TIA-232 порты»? ;)

правильно это - как мне запрограммировать работу с uart16550a

anonymous
()
Ответ на: комментарий от Harald

Работа с послед.портом на СИ без плюсов и диезов

Язык программы СИ (без плюсов без диезов) и GTK+ для окшечек-кнопочек. Окна и кнопки нарисованы" врукопашную, чтобы понять возможности связки «голого» СИ и GTK+ в Линуксе. Это проект в среде Code::Blocks IDE - есть некоторые удобства по сравнению с gedit Анюту я пока отложил из-за скудной документации, «рисование» в GLADE отложу до поры, когда разберусь с ручным «рисованием» - а тогда и «кузнец(скрипач) нам не нужен». vim вероятно достойный инструмент, но хвататься за все сразу ... /* 2 предыдущие строки для тех, кто всенепременно начнет «старую песню о главном», забыв заголовок темы */

«Может вам она как кляча, А мне так просто в самый раз. Я на Вачу ехал плача, А возвращаюсь веселясь!» («Про речку Вачу и попутчицу Валю» В.С. Высоцкий)

Проект еще совсем «сырой». Поэтому 1. кнопка «FILES», 2. кнопка «DIALOG2», все остальное пока развлекуха. Цель: работа с GPS приемниками и навигаторами на чипсетах SirfStar по бинарному протоколу Garmin и SirfStar. Сейчас программа способна соединиться с Гарминами и записать получаемый от них через RS-232 бинарный поток. Модуль работы с портом, в виде консольной программы, получился достаточно быстро. Затем попробовал «нарисовать» окна и кнопки, тоже получилось. Дать пользователю выбор места для сохранения выходных файлов программы - работает. Присоединил к окнам модуль comport - вызывается и работает, НО!!! Чтение из порта (в цикле по 1-секундному таймеру) должно продолжаться до завершения программы пользователем. А выполнить это посредством какой-либо кнопки в каком-либо окне программы я не могу, потому что не знаю, как выйти из функции comport() к этим самым кнопкам в окошках. При этом надо оставить цикл в comport() работающим. Кроме того, после запуска цикла пользователь должен иметь доступ к окошкам-кнопкам для просмотра информации работающей программы: текущие координаты, количество захваченных спутников, уровни их сигналов и т.п. Такую программу в Виндовс (десктоп и мобайл) я сделал и даже не задумывался о том как вернуться с кнопкам. В Линуксе я только осваиваюсь, вместе с консольным вариантом это моя первая программа. Я уже пробовал применить нити-threads, но безуспешно. Возможно решение гораздо проще - в использовании системных сигналов signals, но я их пока не понимаю. Удивительно, но спрашивать помощи на русскоязычных линукс-форумах, КАК ПРАВИЛО, это потеря времени и нервных клеток. Ну это общее место. Полно мчудаков, пардон «профессионалов», которые будут в бесконечном цикле вдохновенно обсуждать какая ОС/язык/программа лучше/хуже, при этом недвусмысленно намЯкивая на свою крутизну в области программирования и глубинного познания ОС. Но на конкретные вопросы способны, в лучшем случае, дать ссылки на книжки и на man'ы. И это при том, что надо просто ткнуть пальцем в то место программы, где НЕПРАВИЛЬНО и тут же написать как ПРАВИЛЬНО.

Комментарии в исходниках на очень сломанном аглицком - упражнения для возможного диалога с пиндосами и дань моде. А то бы я все, вплоть до имен переменных и фунькций, прописал на родном великом и могучем. К исходникам приложу 2 файла, которые пишет программа и terminal-log.txt, из которого видно что и как отрабатывается. В частности, что pthread создается и даже что-то делает: 10 раз через 3 сек. в ст.вывод вкрапляется строка «I'm still running!!!»

Сейчас посмотрю, куда положить файлы и дам ссылку. http://webfile.ru/5537520

sklimkin
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.