The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  вход/выход  слежка  RSS
"Проблема: open() для посл. порта не работает под FreeBSD 10"
Вариант для распечатки  
Пред. тема | След. тема 
Форум Программирование под UNIX (C/C++)
Изначальное сообщение [ Отслеживать ]

"Проблема: open() для посл. порта не работает под FreeBSD 10"  +/
Сообщение от DmitryVS (ok) on 11-Авг-14, 12:03 
Доброго дня всем!
Неожиданно наскочил на проблему. Попытался во FreeBSD 10 собрать свою программу для общения с неким устройством по посл. порту. Открываю порт, как делал раньше:
  fd = open("/dev/cuaU0", O_RDWR | O_NOCTTY | O_NDELAY);
и ничего не выходит. Программа просто зацикливается на этом вызове до ^C, функция никакой ошибки возвращать не торопится, сколько не ждал. Подсмотрел код в picocom (и он работает, что характерно), подствил те же флаги как в нём: O_RDWR | O_NONBLOCK | O_NOCTTY. Те же яйцы - не работает это в моей программе. Закоментил весь код до вызова open() - никакого толку. Что не так, понять не могу. Как отладиться, тоже никаких идей. Что это может быть вообще?

С уважением,
Дмитрий

PS: Другие порты (интегрированные UART) ведут себя так же. Если указать несуществующее устройство, то ругается как положено. На существующих, подвисает на всех.

Ответить | Правка | Cообщить модератору

Оглавление

Сообщения по теме [Сортировка по времени | RSS]


1. "Проблема: open() для посл. порта не работает под FreeBSD 10"  +/
Сообщение от Andrey Mitrofanov on 11-Авг-14, 12:36 
> функция никакой ошибки возвращать не торопится, сколько не ждал. Подсмотрел код
> в picocom (и он работает, что характерно), подствил те же флаги
> как в нём: O_RDWR | O_NONBLOCK | O_NOCTTY. Те же яйцы
> - не работает это в моей программе. Закоментил весь код до
> вызова open() - никакого толку.

Следующий логичный шаг: перенести _весь код до того вызова open() из picocom в свою программу. Копипастить, так по-взрослому.

Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

2. "Проблема: open() для посл. порта не работает под FreeBSD 10"  +/
Сообщение от DmitryVS (ok) on 11-Авг-14, 16:58 
> Следующий логичный шаг: перенести _весь код до того вызова open() из picocom
> в свою программу. Копипастить, так по-взрослому.

Я там тоже весь код перед open() почислил и пересобрал :) так проще оказалось. и всё работало. Но дело было не в бобине. open() вообще был не при чём. Я сам лапоть. Косяк был в моём же коде дальше по тексту, который я до кучи маленько "улучшил" ко всему прочему. Примерно так получилось:
  fd = open(...);
  printf("Check: open() passed!");
  while (1) {...};
Только разве вместо "1" в цикле более развесистая клюква с чтением из порта и условиями оказалась. Затупил я из-за того, что сразу после open() шёл вызов printf(), и он ничего на консоль не выводил. Вот тут я до сих пор в раздумиях, как такое может быть? Даже если есть какой-то хитрый асинхронный вывод на консоль, то код printf() отработал же, по любому консоль обновиться должна, даже если дальше и глухой цикл... Не понимаю...

Ответить | Правка | ^ к родителю #1 | Наверх | Cообщить модератору

3. "Проблема: open() для посл. порта не работает под FreeBSD 10"  +/
Сообщение от pavlinux (ok) on 12-Авг-14, 01:48 
> Что не так, понять не могу. Как отладиться, тоже никаких идей. Что это может быть вообще?

Спроси тут http://z90.ru/forum

Ответить | Правка | ^ к родителю #2 | Наверх | Cообщить модератору

4. "Проблема: open() для посл. порта не работает под FreeBSD 10"  +/
Сообщение от izyk email(ok) on 13-Авг-14, 14:51 
> Вот тут я до сих пор в раздумиях, как такое может
> быть? Даже если есть какой-то хитрый асинхронный вывод на консоль, то
> код printf()

Compare this:
#include <stdio.h>
#include <unistd.h>
main() {
    printf("proba");
    sleep(20);
}
^C
And this:
#include <stdio.h>
#include <unistd.h>
main() {
    printf("proba\n");
    sleep(20);
}
^C

Ответить | Правка | ^ к родителю #2 | Наверх | Cообщить модератору

5. "Проблема: open() для посл. порта не работает под FreeBSD 10"  +/
Сообщение от DmitryVS (ok) on 13-Авг-14, 21:27 
> Compare this:
>     printf("proba");
>     sleep(20);

[...]
> And this:
>     printf("proba\n");
>     sleep(20);

Шайтан коробка! Спасибо за наглядный ликбез. И как это называется, в смысле, как про такую особенность нагуглить и почитать поподробнее?

Ответить | Правка | ^ к родителю #4 | Наверх | Cообщить модератору

6. "Проблема: open() для посл. порта не работает под FreeBSD 10"  +/
Сообщение от izyk email(ok) on 13-Авг-14, 22:04 

> Шайтан коробка! Спасибо за наглядный ликбез. И как это называется, в смысле,
> как про такую особенность нагуглить и почитать поподробнее?

Firstly,
Only IMHO:
http://www.linusakesson.net/programming/tty/

Ответить | Правка | ^ к родителю #5 | Наверх | Cообщить модератору

7. "Проблема: open() для посл. порта не работает под FreeBSD 10"  +/
Сообщение от izyk email(ok) on 13-Авг-14, 22:15 

> Firstly,
> Only IMHO:
> http://www.linusakesson.net/programming/tty/

http://www.linusakesson.net/programming/tty/ - Долгий путь,
Если просто, по умолчанию, "libc" не вызывает "write()" пока не встретит символ '\n'.
Для стандартного потока вывода.

Ответить | Правка | ^ к родителю #6 | Наверх | Cообщить модератору

8. "Проблема: open() для посл. порта не работает под FreeBSD 10"  +/
Сообщение от DmitryVS (ok) on 18-Авг-14, 00:44 
> http://www.linusakesson.net/programming/tty/ - Долгий путь,
> Если просто, по умолчанию, "libc" не вызывает "write()" пока не встретит символ
> '\n'.
> Для стандартного потока вывода.

Всегда думал, что вывод на терминал посимвольный, только ввод построчный, а вот надо же... Буду знать. И большое спасибо за ссылку. Статью прочитал всю полностью, с удовольствием. Отличная статья!

Ответить | Правка | ^ к родителю #7 | Наверх | Cообщить модератору

Архив | Удалить

Рекомендовать для помещения в FAQ | Индекс форумов | Темы | Пред. тема | След. тема




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру