У меня есть две программы для чтения из последовательного порта, какое-то устройство подключено на другом конце. Первая программа написана с использованием фреймворка Qt и использует QextSerialPort для связи с последовательным интерфейсом. Вторая программа написана на чистом C.Являются ли настройки последовательного порта постоянными в Linux?
Проблема такова:
Сразу после загрузки системы, чистая программа 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);
там что-то отсутствует или что?
наилучшие пожелания Marek