2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




 
 Терминал переходит на новую строку, как это предотвратить?
Сообщение23.04.2025, 18:35 
Вывожу в терминале строку данных, которые периодически приходят по UART. Перед каждым новым выводом просто перевожу курсор в начало строки, новая строка затирает старую, получается что строка одна, но значения в ней постоянно меняются.
Код такой:
Используется синтаксис C
............
while (next)
         {
            n=read(fd, buf, 1);
            if (n==1) { printf("%c", buf[0]); fflush(stdout); }
         }
...............
 

Символ '\r' приходит вместе с данными, иначе значения всё время съезжают и их трудно синхронизировать.

Проблема в том что иногда, терминал сам начинает переходить на новую строку, и данные начинают "ехать" по экрану. Как это можно предотвратить?
Единственное что заметил, если запустить другой терминал, подключиться в нём к UART. затем закрыть соединение, и снова запустить программу, то всё работает.

 
 
 
 Re: Терминал переходит на новую строку, как это предотвратить?
Сообщение24.04.2025, 01:37 
Терминал не может ни с того ни с сего переходить на новую строку. Смотрите что за строки вы туда посылаете — либо там есть символы перевода строки, либо ещё какие-то управляющие символы, либо строки просто слишком длинные.

 
 
 
 Re: Терминал переходит на новую строку, как это предотвратить?
Сообщение24.04.2025, 02:10 
Тут, возможно, еще два момента есть:
1. А не приходит-ли битовый мусор, т.к. напрямую из кода не видно очистки от оного (вычисления crc и т.п.).
2. посмотреть в сторону возможности применения двойного сброса
Код:
fflush(f);
fsync(fileno(f));

 
 
 
 Re: Терминал переходит на новую строку, как это предотвратить?
Сообщение24.04.2025, 02:34 
DemISdx
пожалуйста поясните, что делают эти команды?

Код:
fflush(stdout);

у меня стоит, чтобы символы отображались сразу же после поступления, без него они не отображаются до перевода строки,
зачем нужны эти?

 
 
 
 Re: Терминал переходит на новую строку, как это предотвратить?
Сообщение24.04.2025, 08:32 
Missir в сообщении #1683524 писал(а):
что делают эти команды?
Смотрим и внимательно читаем ман
Цитата:
Функция fflush принудительно записывает все буферизированные данные в устройство вывода данных или корректирует поток stream посредством определенных для него функций записи. При этом поток остается открытым.
Цитата:
fsync копирует на диск все части файла, находящиеся в памяти и ожидает пока устройство скажет, что все эти части сохранены. Также данный вызов обновляет информацию о состоянии метаданных. Это создаёт уверенность, что запись в каталоге содержит файл, который также находится на диске. Чтобы проделать это явно вызову fsync также нужен файловый дескриптор каталога.

(Оффтоп)


 
 
 
 Re: Терминал переходит на новую строку, как это предотвратить?
Сообщение24.04.2025, 17:24 
DemISdx
ничего не выходит, поставил эти команды, сначала будто бы всё наладилось, но потом опять ...
запускаю - строки едут, причём строки умещаются, дело не в этом,
запускаю другой терминал и подключаюсь к uart через picocom, начинает читать в оба терминала, потом останавливаю picocom, запускаю свою прогу - и всё нормально. К стати, в picocom строки тоже то едут, а то нет.
Как бы сделать, чтобы у меня всегда всё было в 1 строке?

 
 
 
 Re: Терминал переходит на новую строку, как это предотвратить?
Сообщение24.04.2025, 17:45 
Аватара пользователя
Missir
Я бы проверял в assert-е что buf[0] содержит или '\r' или обычный, не управляющий символ, и что ввод не превосходит отведенную длину. Если assert будет срабатывать, записал бы данные в файл, посмотрел бы, что там, если не сразу в отладчике. А так можно долго экспериментировать.

 
 
 
 Re: Терминал переходит на новую строку, как это предотвратить?
Сообщение24.04.2025, 18:58 
вот так стало гораздо лучше, при запуске строка немножко дёргается, а потом всё норм., если строка помещается полностью, то ничего никуда не едет

Используется синтаксис C
while (next)
         {
            n=read(fd, buf, 1); /*чтения приходящих данных из порта*/    
            if ((n==1) && (buf[0] !='\n')) { printf("%c", buf[0]); fflush(stdout); fsync(fileno(stdout)); }
         }
 

 
 
 [ Сообщений: 8 ] 


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group