ЗАО «ЗЭО»

Пожалуйста, войдите или зарегистрируйтесь.

Расширенный поиск  

Новости:

Автор Тема: работа с UART  (Прочитано 12152 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Paul

  • Jr. Member
  • **
  • Оффлайн Оффлайн
  • Сообщений: 53
работа с UART
« : 11 Ноября, 2014, 08:18:55 »

Добрый день!

Работаю с последовательным портом ttySP1 через библиотеку QTSerialPort, версия QT 4.8.4.
Режим порта RS232 пока (планируется 422).
Столкнулся со следующей проблемой:
Порт работает нормально открывается/закрывается, получает/отправляет данные.
Но если данные на порт поступают непрерывным потоком на скорости 115200 бодд,
то при открытии порта (открытие проходит без ошибок)  данные с порта не поступают.
Повторение процедуры открытия-закрытия порта никак не влияет на результат.
При этом если остановить поток данных до открытия порта и возобновить после открытия порта все работает нормально.
Полагаю проблема связана непосредственно с самим драйвером для Тион-Про28, т.к., на хосте x86 работает все стабильно.
Прошу помочь в решении данного вопроса.





« Последнее редактирование: 11 Ноября, 2014, 08:25:15 от Paul »
Записан

Danila

  • Administrator
  • Hero Member
  • *****
  • Оффлайн Оффлайн
  • Сообщений: 703
Re: работа с UART
« Ответ #1 : 11 Ноября, 2014, 14:42:09 »

Попробуйте очистить буфер с помощью flush() после открытия.

Образ используете наш или свой?
Записан

Paul

  • Jr. Member
  • **
  • Оффлайн Оффлайн
  • Сообщений: 53
Re: работа с UART
« Ответ #2 : 12 Ноября, 2014, 08:38:15 »

Попробуйте очистить буфер с помощью flush() после открытия.
Пробовал, никаких изменений.

Цитата: Danila
Образ используете наш или свой?
Образ ваш, конечно: Linux version 2.6.35.3-zeo-svn2890 (ubuntu@ubuntu) (gcc version 4.4.4 (4.4.4_09.06.2010) ) #19 PREEMPT Wed Mar 26 12:45:06 EDT 2014
Записан

Paul

  • Jr. Member
  • **
  • Оффлайн Оффлайн
  • Сообщений: 53
Re: работа с UART
« Ответ #3 : 13 Ноября, 2014, 12:39:44 »

Надо полагать, при данных обстоятельствах, проблема не решаема?

Возможно, решить косвенным путём: принудительно отключать порт от физической линии данных, использовать для данной цели вывод коммутирующий режим порта 232<->422, как это сделать? Т.о., чтобы перед открытием порта переключить режим, после открытия вернуть обратно.
Записан

Danila

  • Administrator
  • Hero Member
  • *****
  • Оффлайн Оффлайн
  • Сообщений: 703
Re: работа с UART
« Ответ #4 : 14 Ноября, 2014, 19:21:56 »

Поясните про непрерывный поток данных.
Если идет непрерывный поток, UART не может определить стартовый и стоповый бит.

Попробуйте включить аппаратное управление потоком.
Записан

Paul

  • Jr. Member
  • **
  • Оффлайн Оффлайн
  • Сообщений: 53
Re: работа с UART
« Ответ #5 : 17 Ноября, 2014, 09:23:06 »

Поясните про непрерывный поток данных.
Если идет непрерывный поток, UART не может определить стартовый и стоповый бит.
Данные идут пачками по 36 байт, сейчас их генерит соседняя машина, потом будет девайс.
Формат физического протокола формирует стандартный UART-контроллер, не думаю, что там может что-то отклоняться от стандарта т.о., чтобы нельзя было распознать стартовый и стоповый бит, тем более что на хосте под управлением Linux работает все замечательно.

Попробуйте включить аппаратное управление потоком.
Попробовал, при открытии порта формируется сигнал RTS, и передатчик начинает передавать данные - эффект тот же.
Записан

Paul

  • Jr. Member
  • **
  • Оффлайн Оффлайн
  • Сообщений: 53
Re: работа с UART
« Ответ #6 : 17 Ноября, 2014, 14:25:06 »

Проблема оказалась связана с обработкой данных и, вероятно, скоростью процессора.
Т.о., тема закрыта.
Записан

Paul

  • Jr. Member
  • **
  • Оффлайн Оффлайн
  • Сообщений: 53
Re: работа с UART
« Ответ #7 : 19 Ноября, 2014, 09:48:44 »

К сожалению, вынужден поднять тему. При детальном рассмотрении ситуации выяснилась следующая картина:
Со стороны тиона сделана простая программа, которая принятые данные отправляет обратно - режим "эхо".
Далее, если открыть порт в тионе и начать передавать туда сплошные нули, то тион успешно их возвращает назад - см. рис.1 (верхний сигнал данные в тион, нижний - из тиона).
Но если начать передавать данные до открытия порта в тионе, а потом открыть порт, то тион принимает и отдает вместо нулей поочередно два байта - 0x0C и 0x00.  При этом появляются перерывы в принятии данных от порта порядка 10-15мс - см.рис2. Если вместо нулей пересылать другое значение, то искажения появляются более разнообразные.
Что хотелось бы отметить, то если при этом остановить передаваемые данные на входе тиона и возобновить - ничего не изменяется, только если закрыть-открыть порт при отсутствующих на входе данных тион начинает нормально работать.

Прошу помочь в решении данной проблемы.
« Последнее редактирование: 19 Ноября, 2014, 09:50:51 от Paul »
Записан

Danila

  • Administrator
  • Hero Member
  • *****
  • Оффлайн Оффлайн
  • Сообщений: 703
Re: работа с UART
« Ответ #8 : 19 Ноября, 2014, 18:53:14 »

Управление потоком включено?
Пришлите текст программы для Тиона.
Записан

Paul

  • Jr. Member
  • **
  • Оффлайн Оффлайн
  • Сообщений: 53
Re: работа с UART
« Ответ #9 : 20 Ноября, 2014, 07:56:40 »

Управление потоком включено?
Ранее сообщал, что результата не принесло.

Пришлите текст программы для Тиона.

По сути, код тривиален:

void MainWindow::readData()
{
    QByteArray data = serial->readAll();
    serial->write(data);
}

Для наглядности, я использовал готовый проект "terminal" из набора примеров к qserialport.
Вывод в консоль заменил на отправку данных обратно в порт. Проект во вложении.
Можно было бы приложить исполняемый код, но тогда понадобятся библиотеки Qt.

Еще раз напомню, скорость 115200, на скорости 9600 все будет работать.
Записан

Paul

  • Jr. Member
  • **
  • Оффлайн Оффлайн
  • Сообщений: 53
Re: работа с UART
« Ответ #10 : 02 Декабря, 2014, 11:23:45 »

Так какое решение будет предложено производителем тионов?

Предположительно, что проблема кроется на "железячном" или "околожелезячном" (на уровне драйвера) уровне.
Вам удалось воспроизвести данный эффект?
Записан

Danila

  • Administrator
  • Hero Member
  • *****
  • Оффлайн Оффлайн
  • Сообщений: 703
Re: работа с UART
« Ответ #11 : 03 Декабря, 2014, 12:25:47 »

Пока нет. Займемся этим вопросом в течение неделе.
Записан

Danila

  • Administrator
  • Hero Member
  • *****
  • Оффлайн Оффлайн
  • Сообщений: 703
Re: работа с UART
« Ответ #12 : 05 Декабря, 2014, 19:28:52 »

Эффект воспроизвести не удалось.
С ПК слал данные в бесконечном цикле. На Тионе читал программой, прикрепил ее к сообщению. Программа на С, без Qt.
Данные приходят без ошибок, на скорости 115200.

Попробуйте запустить ее на своем Тионе.
Записан

Paul

  • Jr. Member
  • **
  • Оффлайн Оффлайн
  • Сообщений: 53
Re: работа с UART
« Ответ #13 : 10 Декабря, 2014, 07:56:26 »

Попробуйте запустить ее на своем Тионе.

Попробовал, работает нормально, благодарю.
Т.о., проблема оказалась связана с самим модулем qserialport.
Пока решил её таким образом, перед открытием порта в qserialport сделал вставку:
struct termios tio;
int tty_fd;
int n;
char tmp;

memset(&tio,0,sizeof(tio));
tio.c_cflag=CS8|CREAD|CLOCAL;           // 8n1, see termios.h for more information
tio.c_cc[VMIN]=1;
tio.c_cc[VTIME]=5;
tty_fd=::open("/dev/ttySP1", O_RDWR | O_NONBLOCK);
if(tty_fd)
{
cfsetospeed(&tio,B115200);            // 115200 baud
cfsetispeed(&tio,B115200);            // 115200 baud
tcsetattr(tty_fd,TCSANOW,&tio);
tcflush(tty_fd, TCIOFLUSH);
do
{
n=read(tty_fd, &tmp, 1);
} while(n>0);
::close(tty_fd);
}
« Последнее редактирование: 10 Декабря, 2014, 07:58:16 от Paul »
Записан

Setekh

  • Newbie
  • *
  • Оффлайн Оффлайн
  • Сообщений: 12
Re: работа с UART
« Ответ #14 : 04 Марта, 2015, 16:12:48 »

Хочу использовать AUART3. Как изменить альтернативную функцию на AUART3, ведь по умолчанию включен CAN0.
Записан