2014-01-30 7 views
2

У меня есть две программы для чтения из последовательного порта, какое-то устройство подключено на другом конце. Первая программа написана с использованием фреймворка 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

ответ

0

Я хватался за соломинку здесь, но, прежде чем делать что-нибудь еще, я хотел бы предложить подключения другого терминала к другой стороне и посмотреть, если что-то происходит на всех. Ваша проблема мощь быть тот факт, что вы не установки режима управления потоком в приложении C, попробуйте

options.c_cflag &= ~CRTSCTS; 

Если он все еще не работает, посмотрите на принятый ответ here; Я использовал код несколько раз в прошлом и никогда не испытывал проблем с последовательными коммуникациями.

Смежные вопросы