ЗАО «ЗЭО»

Техническая поддержка пользователей => Тион-Про28, Орион28 => Тема начата: Paul от 11 Ноября, 2014, 08:18:55

Название: работа с UART
Отправлено: Paul от 11 Ноября, 2014, 08:18:55
Добрый день!

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





Название: Re: работа с UART
Отправлено: Danila от 11 Ноября, 2014, 14:42:09
Попробуйте очистить буфер с помощью flush() после открытия.

Образ используете наш или свой?
Название: Re: работа с UART
Отправлено: Paul от 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
Название: Re: работа с UART
Отправлено: Paul от 13 Ноября, 2014, 12:39:44
Надо полагать, при данных обстоятельствах, проблема не решаема?

Возможно, решить косвенным путём: принудительно отключать порт от физической линии данных, использовать для данной цели вывод коммутирующий режим порта 232<->422, как это сделать? Т.о., чтобы перед открытием порта переключить режим, после открытия вернуть обратно.
Название: Re: работа с UART
Отправлено: Danila от 14 Ноября, 2014, 19:21:56
Поясните про непрерывный поток данных.
Если идет непрерывный поток, UART не может определить стартовый и стоповый бит.

Попробуйте включить аппаратное управление потоком.
Название: Re: работа с UART
Отправлено: Paul от 17 Ноября, 2014, 09:23:06
Поясните про непрерывный поток данных.
Если идет непрерывный поток, UART не может определить стартовый и стоповый бит.
Данные идут пачками по 36 байт, сейчас их генерит соседняя машина, потом будет девайс.
Формат физического протокола формирует стандартный UART-контроллер, не думаю, что там может что-то отклоняться от стандарта т.о., чтобы нельзя было распознать стартовый и стоповый бит, тем более что на хосте под управлением Linux работает все замечательно.

Попробуйте включить аппаратное управление потоком.
Попробовал, при открытии порта формируется сигнал RTS, и передатчик начинает передавать данные - эффект тот же.
Название: Re: работа с UART
Отправлено: Paul от 17 Ноября, 2014, 14:25:06
Проблема оказалась связана с обработкой данных и, вероятно, скоростью процессора.
Т.о., тема закрыта.
Название: Re: работа с UART
Отправлено: Paul от 19 Ноября, 2014, 09:48:44
К сожалению, вынужден поднять тему. При детальном рассмотрении ситуации выяснилась следующая картина:
Со стороны тиона сделана простая программа, которая принятые данные отправляет обратно - режим "эхо".
Далее, если открыть порт в тионе и начать передавать туда сплошные нули, то тион успешно их возвращает назад - см. рис.1 (верхний сигнал данные в тион, нижний - из тиона).
Но если начать передавать данные до открытия порта в тионе, а потом открыть порт, то тион принимает и отдает вместо нулей поочередно два байта - 0x0C и 0x00.  При этом появляются перерывы в принятии данных от порта порядка 10-15мс - см.рис2. Если вместо нулей пересылать другое значение, то искажения появляются более разнообразные.
Что хотелось бы отметить, то если при этом остановить передаваемые данные на входе тиона и возобновить - ничего не изменяется, только если закрыть-открыть порт при отсутствующих на входе данных тион начинает нормально работать.

Прошу помочь в решении данной проблемы.
Название: Re: работа с UART
Отправлено: Danila от 19 Ноября, 2014, 18:53:14
Управление потоком включено?
Пришлите текст программы для Тиона.
Название: Re: работа с UART
Отправлено: Paul от 20 Ноября, 2014, 07:56:40
Управление потоком включено?
Ранее сообщал, что результата не принесло.

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

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

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

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

Еще раз напомню, скорость 115200, на скорости 9600 все будет работать.
Название: Re: работа с UART
Отправлено: Paul от 02 Декабря, 2014, 11:23:45
Так какое решение будет предложено производителем тионов?

Предположительно, что проблема кроется на "железячном" или "околожелезячном" (на уровне драйвера) уровне.
Вам удалось воспроизвести данный эффект?
Название: Re: работа с UART
Отправлено: Danila от 03 Декабря, 2014, 12:25:47
Пока нет. Займемся этим вопросом в течение неделе.
Название: Re: работа с UART
Отправлено: Danila от 05 Декабря, 2014, 19:28:52
Эффект воспроизвести не удалось.
С ПК слал данные в бесконечном цикле. На Тионе читал программой, прикрепил ее к сообщению. Программа на С, без Qt.
Данные приходят без ошибок, на скорости 115200.

Попробуйте запустить ее на своем Тионе.
Название: Re: работа с UART
Отправлено: Paul от 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);
}
Название: Re: работа с UART
Отправлено: Setekh от 04 Марта, 2015, 16:12:48
Хочу использовать AUART3. Как изменить альтернативную функцию на AUART3, ведь по умолчанию включен CAN0.
Название: Re: работа с UART
Отправлено: Danila от 04 Марта, 2015, 16:27:37
Нужно вносить изменения в исходники ОС и пересобирать образ.
Название: Re: работа с UART
Отправлено: Setekh от 04 Марта, 2015, 16:30:05
А куда именно?
Название: Re: работа с UART
Отправлено: Danila от 04 Марта, 2015, 17:43:13
Какая ОС?
Название: Re: работа с UART
Отправлено: Setekh от 05 Марта, 2015, 09:18:21
Linux XX 2.6.35.3-zeo-svn2890
Название: Re: работа с UART
Отправлено: Danila от 06 Марта, 2015, 11:47:08
В конфигурации ядра (через ltib) нужно отключить драйвер CAN.
Название: Re: работа с UART
Отправлено: Setekh от 09 Марта, 2015, 11:48:43
В ltib
- в пакетах убрал   cantest, can4linux
- в конфигах ядра убрал поддержку CAN вообще
Configure the kernel

    < > CAN bus subsystem support  --->
- проверил в конфигах ядра включен ли AUART3
System Type  --->
   Freescale Application UART:  --->
     

Шлю в AUART1  echo "qwerty" > /dev/ttySP1 сигнал есть
Тоже самое шлю в AUART3 echo "qwerty" > /dev/ttySP3    - тишина
Что я делаю не так?


Название: Re: работа с UART
Отправлено: Setekh от 09 Марта, 2015, 12:11:56
Дело было не в бабине.
Все дело в микрухе DD18 (74LVC1G02), которая логический элемент или-не. Её выход (4pin) в исходном состоянии - высокий. И AUART3_TX не может просадить сигнал до логическго нуля.
Проверял разорвав дорожку питания DD18.

Название: Re: работа с UART
Отправлено: Danila от 10 Марта, 2015, 19:28:39
Да, микросхема мешает. Можно переключить сигнал AUART3_TX на другую ножку - в файле ltib/rpm/Build/linux/arch/arm/mach-mx28/mx28evk_pins.c поменять функцию выводу SSP2_SS0 на UART_TX, и подключаться к разъему Х15-6.