2014 dxdy logo

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

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




Начать новую тему Ответить на тему
 
 Терминал переходит на новую строку, как это предотвратить?
Сообщение23.04.2025, 18:35 


15/12/22
253
Вывожу в терминале строку данных, которые периодически приходят по 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 
Заслуженный участник


02/08/11
7128
Терминал не может ни с того ни с сего переходить на новую строку. Смотрите что за строки вы туда посылаете — либо там есть символы перевода строки, либо ещё какие-то управляющие символы, либо строки просто слишком длинные.

 Профиль  
                  
 
 Re: Терминал переходит на новую строку, как это предотвратить?
Сообщение24.04.2025, 02:10 


22/11/17
74
Тут, возможно, еще два момента есть:
1. А не приходит-ли битовый мусор, т.к. напрямую из кода не видно очистки от оного (вычисления crc и т.п.).
2. посмотреть в сторону возможности применения двойного сброса
Код:
fflush(f);
fsync(fileno(f));

 Профиль  
                  
 
 Re: Терминал переходит на новую строку, как это предотвратить?
Сообщение24.04.2025, 02:34 


15/12/22
253
DemISdx
пожалуйста поясните, что делают эти команды?

Код:
fflush(stdout);

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

 Профиль  
                  
 
 Re: Терминал переходит на новую строку, как это предотвратить?
Сообщение24.04.2025, 08:32 


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

(Оффтоп)


 Профиль  
                  
 
 Re: Терминал переходит на новую строку, как это предотвратить?
Сообщение24.04.2025, 17:24 


15/12/22
253
DemISdx
ничего не выходит, поставил эти команды, сначала будто бы всё наладилось, но потом опять ...
запускаю - строки едут, причём строки умещаются, дело не в этом,
запускаю другой терминал и подключаюсь к uart через picocom, начинает читать в оба терминала, потом останавливаю picocom, запускаю свою прогу - и всё нормально. К стати, в picocom строки тоже то едут, а то нет.
Как бы сделать, чтобы у меня всегда всё было в 1 строке?

 Профиль  
                  
 
 Re: Терминал переходит на новую строку, как это предотвратить?
Сообщение24.04.2025, 17:45 
Аватара пользователя


14/12/17
1552
деревня Инет-Кельмында
Missir
Я бы проверял в assert-е что buf[0] содержит или '\r' или обычный, не управляющий символ, и что ввод не превосходит отведенную длину. Если assert будет срабатывать, записал бы данные в файл, посмотрел бы, что там, если не сразу в отладчике. А так можно долго экспериментировать.

 Профиль  
                  
 
 Re: Терминал переходит на новую строку, как это предотвратить?
Сообщение24.04.2025, 18:58 


15/12/22
253
вот так стало гораздо лучше, при запуске строка немножко дёргается, а потом всё норм., если строка помещается полностью, то ничего никуда не едет

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

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 8 ] 

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group