Постоянны ли настройки последовательного порта в Linux?
У меня есть две программы для чтения из последовательного порта, какое-то устройство подключено на другом конце. Первая программа написана с использованием фреймворка Qt и использует QextSerialPort для связи с последовательным интерфейсом. Вторая программа написана на чистом C.
Проблема такова:
Сразу после загрузки системы программа на чистом C сталкивается с проблемой чтения данных из последовательного порта, я знаю, что она отправляет данные должным образом, потому что устройство реагирует на данные, хотя pselect (который отслеживает serial_fd) никогда не возвращается с serial_fd для чтения данных с устройства.
Когда я запускаю вторую программу (написанную на Qt), она сразу отправляет и получает данные с устройства, никаких проблем.
Более того, после того, как я запустил программу Qt, а затем программу на чистом C, чистый C неожиданно работал без сбоев, пока я снова не перезагрузил систему. Таким образом, похоже, что программа, написанная на Qt, постоянно изменяет некоторые настройки последовательного порта во время инициализации, возможно ли это?
Ниже приведен фрагмент кода из программы Qt, которая инициализирует последовательный порт:
if (rs232->open(QIODevice::ReadWrite)) {
rs232->setBaudRate(BAUD38400);
rs232->setFlowControl(FLOW_OFF);
rs232->setParity(PAR_NONE);
rs232->setDataBits(DATA_8);
rs232->setStopBits(STOP_1);
connect(rs232, SIGNAL(readyRead()), this, SLOT(onReadyRead()));
} else {
qDebug() << "Rs232::rs232Connect OPEN PORT FAILURE";
exit(1);
}
И это из чистой программы на C:
fd = open("/dev/ttyAMA0", O_RDWR | O_NOCTTY | O_NDELAY);
if (fd == -1) {
/*
* Could not open the port.
*/
error_exit(ERROR,"open_port: Unable to open /dev/ttyAMA0");
}
else
fcntl(fd, F_SETFL, 0);
/*
* Get the current options for the port...
*/
tcgetattr(fd, &options);
/*
* Set the baud rates to 19200...
*/
cfsetispeed(&options, B38400);
cfsetospeed(&options, B38400);
/*
* Enable the receiver and set local mode...
*/
options.c_cflag |= (CLOCAL | CREAD);
options.c_cflag &= ~PARENB;
options.c_cflag &= ~CSTOPB;
options.c_cflag &= ~CSIZE;
options.c_cflag |= CS8;
/*
* Set the new options for the port...
*/
tcsetattr(fd, TCSANOW, &options);
Чего-то не хватает или что?
с наилучшими пожеланиями Марек
2 ответа
Я хватаюсь за соломинку здесь, но прежде чем делать что-то еще, я бы предложил подключить другой терминал к другой стороне и посмотреть, происходит ли что-нибудь вообще. Ваша проблема может быть в том, что вы не устанавливаете режим управления потоком в приложении C, попробуйте
options.c_cflag &= ~CRTSCTS;
Если это все еще не работает, посмотрите на принятый ответ здесь; Я использовал код пару раз в прошлом, и у меня никогда не было проблем с последовательной связью.
Я знаю, что вопрос старый, но до сих пор нет ответа на исходный вопрос в заголовке.
Итак, да, настройки последовательного порта сохраняются в Linux в том смысле, что настройки, сделанные для порта одним процессом, могут быть видны другому процессу, даже если первый процесс уже завершен.
Настройки сбрасываются в процессе загрузки системы.
Кроме того, существует специальная утилита командной строки для запроса и установки параметров последовательного порта: stty.
Например, для запроса настроек последовательного порта вы можете использовать:
stty -F /dev/ttyS0
что может быть полезно в вашем случае, чтобы сравнить настройки последовательного порта после запуска обоих приложений и найти разницу, которая заставляет работать второе приложение.