Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Зависает close() / 14 сообщений из 14, страница 1 из 1
04.08.2006, 10:49
    #33899110
Akh
Akh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Зависает close()
В чем дело и как с этим бороться?

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
Rs232::Rs232(char *portname, int mode, char *bound) {
    int _bound;
    char *bound_start;

    if ((port1 = open(portname, mode | O_NOCTTY | O_NONBLOCK)) == - 1 ) {
#ifdef RS232_CONSOLE
	perror("Ошибка открытия порта")
#endif
	;
    }
    else {
        _bound=B19200;
	if (bound) {
	    if (bound[ 0 ]=='B') bound_start=bound+ 1 ;
	    else bound_start=bound;
	    if (!strcmp(bound_start, "0")) _bound=B0;
	    if (!strcmp(bound_start, "50")) _bound=B50;
	    if (!strcmp(bound_start, "75")) _bound=B75;
	    if (!strcmp(bound_start, "110")) _bound=B110;
	    if (!strcmp(bound_start, "134")) _bound=B134;
	    if (!strcmp(bound_start, "150")) _bound=B150;
	    if (!strcmp(bound_start, "200")) _bound=B200;
	    if (!strcmp(bound_start, "300")) _bound=B300;
	    if (!strcmp(bound_start, "600")) _bound=B600;
	    if (!strcmp(bound_start, "1200")) _bound=B1200;
	    if (!strcmp(bound_start, "1800")) _bound=B1800;
	    if (!strcmp(bound_start, "2400")) _bound=B2400;
	    if (!strcmp(bound_start, "4800")) _bound=B4800;
	    if (!strcmp(bound_start, "9600")) _bound=B9600;
	    if (!strcmp(bound_start, "19200")) _bound=B19200;
	    if (!strcmp(bound_start, "38400")) _bound=B38400;
	    if (!strcmp(bound_start, "57600")) _bound=B57600;
	    if (!strcmp(bound_start, "115200")) _bound=B115200;
	    if (!strcmp(bound_start, "230400")) _bound=B230400;
	}
    
	struct termios oldtio, newtio;

            tcgetattr(port1, &oldtio);
	newtio.c_cflag=_bound | CRTSCTS | CS8 | CLOCAL | CREAD;
	newtio.c_iflag=IGNPAR;
	newtio.c_oflag= 0 ;
	newtio.c_lflag= 0 ;//ICANON;
	newtio.c_cc[VMIN]= 0 ;
	newtio.c_cc[VTIME]= 1 ;
	tcflush(port1, TCIFLUSH);
	tcsetattr(port1, TCSANOW, &newtio);
    }
}

bool Rs232::ready() {
    if (port1==- 1 ) return false;
	      else return true;
}

int Rs232::readb(unsigned char *b, int n) {
    return read(port1, b, n);
}

int Rs232::writeb(unsigned char *b, int n) {
    return write(port1, b, n);
}

#include <stdio.h>

Rs232::~Rs232() {
FILE *f=fopen("a111", "w");
fclose(f);

    if (port1 != - 1 ) {
f=fopen("a222", "w");
fclose(f);
	close(port1);
f=fopen("a333", "w");
fclose(f);
    }
f=fopen("a444", "w");
fclose(f);
}

Пишется в порт 2 раза по 16 байт. Потом идет попытка удаления объекта и после a222 кирдык.
...
Рейтинг: 0 / 0
04.08.2006, 10:51
    #33899118
Akh
Akh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Зависает close()
Забыл уточнить, что второй конец шнурка оторван.
...
Рейтинг: 0 / 0
04.08.2006, 13:49
    #33899792
Dmitrii K.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Зависает close()
RSипед пишешь, что-ли? ;)
Так их уже понаписывали... возьми готовый или поищи примеры работающих сорцов.
Платформа какая?
Проверяй ошибки чтения/записи в порт, результат close() ... Тут многое от ОС зависит.

>> Забыл уточнить, что второй конец шнурка оторван.
А как проверяешь тогда? Замкнул бы уже TxD с RxD для тестов, что-ли...
...
Рейтинг: 0 / 0
04.08.2006, 16:18
    #33900312
Akh
Akh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Зависает close()
Dmitrii K.RSипед пишешь, что-ли? ;)
Так их уже понаписывали... возьми готовый или поищи примеры работающих сорцов.
Платформа какая?
Проверяй ошибки чтения/записи в порт, результат close() ... Тут многое от ОС зависит.

>> Забыл уточнить, что второй конец шнурка оторван.
А как проверяешь тогда? Замкнул бы уже TxD с RxD для тестов, что-ли...

Уже рисипедю на этом классе (почти этом) несколько лет, но на клозу много внимания не обращал. Платформа линух. Пишется нормуль, есс-но ничег не читается.

Когда подключен куда-нидь - ОК. Надо для программы, уметь его срубать, когда хочеться, например, кто-нибудь перешел на эрэс, а канала нету. Тогда идем на езернет, например, а эрэс завис, соответственно, менеджер переключения каналов дохнет.
...
Рейтинг: 0 / 0
04.08.2006, 17:00
    #33900453
Dmitrii K.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Зависает close()
AkhПлатформа линух.
Ну, тогда не знаю, с линухом дела не имел.
try catch , что-ли, попробуй...
Тут надо смотреть, как система с портами работает...

Линух - это ж опенсорц , так что зри в корень )
...
Рейтинг: 0 / 0
04.08.2006, 17:05
    #33900473
Akh
Akh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Зависает close()
Dmitrii K.Линух - это ж опенсорц , так что зри в корень )

Садюга. :)
...
Рейтинг: 0 / 0
04.08.2006, 17:11
    #33900495
Akh
Akh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Зависает close()
Ту олл:
Есть мысля, что порт, перед закрытием пытается, что-то отработать, так как данные в него пихались. Но не может из-за того, что шнурок оторван. Если это так, то как сделать, чтобы он всю свою ответственность скинул и молча закрыл порт?
...
Рейтинг: 0 / 0
04.08.2006, 19:48
    #33900887
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Зависает close()
Не использой f* функции. Они буферизируют обращение с файлом.
Используй простые open/read/write/close.
...
Рейтинг: 0 / 0
07.08.2006, 09:43
    #33902243
Akh
Akh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Зависает close()
White OwlНе использой f* функции. Они буферизируют обращение с файлом.
Используй простые open/read/write/close.

Без них тоже виснет
...
Рейтинг: 0 / 0
17.08.2006, 13:30
    #33924659
Akh
Akh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Зависает close()
Up Проблема до сих пор не решена
...
Рейтинг: 0 / 0
17.08.2006, 13:38
    #33924697
kolobok0
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Зависает close()
AkhUp Проблема до сих пор не решена

глупый вопрос...
а НЕ в деструкторе дышит ?

(круглый)
...
Рейтинг: 0 / 0
17.08.2006, 13:48
    #33924758
Akh
Akh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Зависает close()
kolobok0глупый вопрос...
а НЕ в деструкторе дышит ?


Не проверял. А какая разница?

PS: Какой автор, такие и вопросы.
...
Рейтинг: 0 / 0
17.08.2006, 15:32
    #33925175
Barlone
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Зависает close()
newtio.c_cflag=_bound | CRTSCTS | CS8 | CLOCAL | CREAD;
CRTSCTS - flow control
Второй конец шнурка оторван - сигнала готовности нет - ваши байты лежат где-то в буфере и ждут отправки. Попробуйте сделать tcflush(port1, TCOFLUSH) перед close
...
Рейтинг: 0 / 0
17.08.2006, 16:02
    #33925328
Akh
Akh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Зависает close()
Barlonenewtio.c_cflag=_bound | CRTSCTS | CS8 | CLOCAL | CREAD;
CRTSCTS - flow control
Второй конец шнурка оторван - сигнала готовности нет - ваши байты лежат где-то в буфере и ждут отправки. Попробуйте сделать tcflush(port1, TCOFLUSH) перед close

Супер! Наконец-то! Примерно это я и искал. Спасибо.
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Зависает close() / 14 сообщений из 14, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]