Доброго дня всем!
Неожиданно наскочил на проблему. Попытался во FreeBSD 10 собрать свою программу для общения с неким устройством по посл. порту. Открываю порт, как делал раньше:
fd = open("/dev/cuaU0", O_RDWR | O_NOCTTY | O_NDELAY);
и ничего не выходит. Программа просто зацикливается на этом вызове до ^C, функция никакой ошибки возвращать не торопится, сколько не ждал. Подсмотрел код в picocom (и он работает, что характерно), подствил те же флаги как в нём: O_RDWR | O_NONBLOCK | O_NOCTTY. Те же яйцы - не работает это в моей программе. Закоментил весь код до вызова open() - никакого толку. Что не так, понять не могу. Как отладиться, тоже никаких идей. Что это может быть вообще?С уважением,
ДмитрийPS: Другие порты (интегрированные UART) ведут себя так же. Если указать несуществующее устройство, то ругается как положено. На существующих, подвисает на всех.
> функция никакой ошибки возвращать не торопится, сколько не ждал. Подсмотрел код
> в picocom (и он работает, что характерно), подствил те же флаги
> как в нём: O_RDWR | O_NONBLOCK | O_NOCTTY. Те же яйцы
> - не работает это в моей программе. Закоментил весь код до
> вызова open() - никакого толку.Следующий логичный шаг: перенести _весь код до того вызова open() из picocom в свою программу. Копипастить, так по-взрослому.
> Следующий логичный шаг: перенести _весь код до того вызова open() из picocom
> в свою программу. Копипастить, так по-взрослому.Я там тоже весь код перед open() почислил и пересобрал :) так проще оказалось. и всё работало. Но дело было не в бобине. open() вообще был не при чём. Я сам лапоть. Косяк был в моём же коде дальше по тексту, который я до кучи маленько "улучшил" ко всему прочему. Примерно так получилось:
fd = open(...);
printf("Check: open() passed!");
while (1) {...};
Только разве вместо "1" в цикле более развесистая клюква с чтением из порта и условиями оказалась. Затупил я из-за того, что сразу после open() шёл вызов printf(), и он ничего на консоль не выводил. Вот тут я до сих пор в раздумиях, как такое может быть? Даже если есть какой-то хитрый асинхронный вывод на консоль, то код printf() отработал же, по любому консоль обновиться должна, даже если дальше и глухой цикл... Не понимаю...
> Что не так, понять не могу. Как отладиться, тоже никаких идей. Что это может быть вообще?Спроси тут http://z90.ru/forum
> Вот тут я до сих пор в раздумиях, как такое может
> быть? Даже если есть какой-то хитрый асинхронный вывод на консоль, то
> код 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
> Compare this:
> printf("proba");
> sleep(20);[...]
> And this:
> printf("proba\n");
> sleep(20);Шайтан коробка! Спасибо за наглядный ликбез. И как это называется, в смысле, как про такую особенность нагуглить и почитать поподробнее?
> Шайтан коробка! Спасибо за наглядный ликбез. И как это называется, в смысле,
> как про такую особенность нагуглить и почитать поподробнее?Firstly,
Only IMHO:
http://www.linusakesson.net/programming/tty/
> Firstly,
> Only IMHO:
> http://www.linusakesson.net/programming/tty/http://www.linusakesson.net/programming/tty/ - Долгий путь,
Если просто, по умолчанию, "libc" не вызывает "write()" пока не встретит символ '\n'.
Для стандартного потока вывода.
> http://www.linusakesson.net/programming/tty/ - Долгий путь,
> Если просто, по умолчанию, "libc" не вызывает "write()" пока не встретит символ
> '\n'.
> Для стандартного потока вывода.Всегда думал, что вывод на терминал посимвольный, только ввод построчный, а вот надо же... Буду знать. И большое спасибо за ссылку. Статью прочитал всю полностью, с удовольствием. Отличная статья!