ЗАО «ЗЭО»
Техническая поддержка пользователей => Тион-Про28, Орион28 => Тема начата: Paul от 11 Ноября, 2014, 08:18:55
-
Добрый день!
Работаю с последовательным портом ttySP1 через библиотеку QTSerialPort, версия QT 4.8.4.
Режим порта RS232 пока (планируется 422).
Столкнулся со следующей проблемой:
Порт работает нормально открывается/закрывается, получает/отправляет данные.
Но если данные на порт поступают непрерывным потоком на скорости 115200 бодд,
то при открытии порта (открытие проходит без ошибок) данные с порта не поступают.
Повторение процедуры открытия-закрытия порта никак не влияет на результат.
При этом если остановить поток данных до открытия порта и возобновить после открытия порта все работает нормально.
Полагаю проблема связана непосредственно с самим драйвером для Тион-Про28, т.к., на хосте x86 работает все стабильно.
Прошу помочь в решении данного вопроса.
-
Попробуйте очистить буфер с помощью flush() после открытия.
Образ используете наш или свой?
-
Попробуйте очистить буфер с помощью flush() после открытия.
Пробовал, никаких изменений.
Образ используете наш или свой?
Образ ваш, конечно: 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
-
Надо полагать, при данных обстоятельствах, проблема не решаема?
Возможно, решить косвенным путём: принудительно отключать порт от физической линии данных, использовать для данной цели вывод коммутирующий режим порта 232<->422, как это сделать? Т.о., чтобы перед открытием порта переключить режим, после открытия вернуть обратно.
-
Поясните про непрерывный поток данных.
Если идет непрерывный поток, UART не может определить стартовый и стоповый бит.
Попробуйте включить аппаратное управление потоком.
-
Поясните про непрерывный поток данных.
Если идет непрерывный поток, UART не может определить стартовый и стоповый бит.
Данные идут пачками по 36 байт, сейчас их генерит соседняя машина, потом будет девайс.
Формат физического протокола формирует стандартный UART-контроллер, не думаю, что там может что-то отклоняться от стандарта т.о., чтобы нельзя было распознать стартовый и стоповый бит, тем более что на хосте под управлением Linux работает все замечательно.
Попробуйте включить аппаратное управление потоком.
Попробовал, при открытии порта формируется сигнал RTS, и передатчик начинает передавать данные - эффект тот же.
-
Проблема оказалась связана с обработкой данных и, вероятно, скоростью процессора.
Т.о., тема закрыта.
-
К сожалению, вынужден поднять тему. При детальном рассмотрении ситуации выяснилась следующая картина:
Со стороны тиона сделана простая программа, которая принятые данные отправляет обратно - режим "эхо".
Далее, если открыть порт в тионе и начать передавать туда сплошные нули, то тион успешно их возвращает назад - см. рис.1 (верхний сигнал данные в тион, нижний - из тиона).
Но если начать передавать данные до открытия порта в тионе, а потом открыть порт, то тион принимает и отдает вместо нулей поочередно два байта - 0x0C и 0x00. При этом появляются перерывы в принятии данных от порта порядка 10-15мс - см.рис2. Если вместо нулей пересылать другое значение, то искажения появляются более разнообразные.
Что хотелось бы отметить, то если при этом остановить передаваемые данные на входе тиона и возобновить - ничего не изменяется, только если закрыть-открыть порт при отсутствующих на входе данных тион начинает нормально работать.
Прошу помочь в решении данной проблемы.
-
Управление потоком включено?
Пришлите текст программы для Тиона.
-
Управление потоком включено?
Ранее сообщал, что результата не принесло.
Пришлите текст программы для Тиона.
По сути, код тривиален:
void MainWindow::readData()
{
QByteArray data = serial->readAll();
serial->write(data);
}
Для наглядности, я использовал готовый проект "terminal" из набора примеров к qserialport.
Вывод в консоль заменил на отправку данных обратно в порт. Проект во вложении.
Можно было бы приложить исполняемый код, но тогда понадобятся библиотеки Qt.
Еще раз напомню, скорость 115200, на скорости 9600 все будет работать.
-
Так какое решение будет предложено производителем тионов?
Предположительно, что проблема кроется на "железячном" или "околожелезячном" (на уровне драйвера) уровне.
Вам удалось воспроизвести данный эффект?
-
Пока нет. Займемся этим вопросом в течение неделе.
-
Эффект воспроизвести не удалось.
С ПК слал данные в бесконечном цикле. На Тионе читал программой, прикрепил ее к сообщению. Программа на С, без Qt.
Данные приходят без ошибок, на скорости 115200.
Попробуйте запустить ее на своем Тионе.
-
Попробуйте запустить ее на своем Тионе.
Попробовал, работает нормально, благодарю.
Т.о., проблема оказалась связана с самим модулем 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);
}
-
Хочу использовать AUART3. Как изменить альтернативную функцию на AUART3, ведь по умолчанию включен CAN0.
-
Нужно вносить изменения в исходники ОС и пересобирать образ.
-
А куда именно?
-
Какая ОС?
-
Linux XX 2.6.35.3-zeo-svn2890
-
В конфигурации ядра (через ltib) нужно отключить драйвер CAN.
-
В ltib
- в пакетах убрал cantest, can4linux
- в конфигах ядра убрал поддержку CAN вообще
Configure the kernel
< > CAN bus subsystem support --->
- проверил в конфигах ядра включен ли AUART3
System Type --->
Freescale Application UART: --->
- Application uart 3 enabled.
Шлю в AUART1 echo "qwerty" > /dev/ttySP1 сигнал есть
Тоже самое шлю в AUART3 echo "qwerty" > /dev/ttySP3 - тишина
Что я делаю не так?
-
Дело было не в бабине.
Все дело в микрухе DD18 (74LVC1G02), которая логический элемент или-не. Её выход (4pin) в исходном состоянии - высокий. И AUART3_TX не может просадить сигнал до логическго нуля.
Проверял разорвав дорожку питания DD18.
-
Да, микросхема мешает. Можно переключить сигнал AUART3_TX на другую ножку - в файле ltib/rpm/Build/linux/arch/arm/mach-mx28/mx28evk_pins.c поменять функцию выводу SSP2_SS0 на UART_TX, и подключаться к разъему Х15-6.