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

Исходное сообщение
"Проблема: open() для посл. порта не работает под FreeBSD 10"

Отправлено DmitryVS , 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) ведут себя так же. Если указать несуществующее устройство, то ругается как положено. На существующих, подвисает на всех.


Содержание

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

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


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

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


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

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


"Проблема: open() для посл. порта не работает под FreeBSD 10"
Отправлено izyk , 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


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

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

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


"Проблема: open() для посл. порта не работает под FreeBSD 10"
Отправлено izyk , 13-Авг-14 22:04 

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

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


"Проблема: open() для посл. порта не работает под FreeBSD 10"
Отправлено izyk , 13-Авг-14 22:15 

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

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


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

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