Я написал программу, которая может выполняться на переднем или заднем плане. Программа использует последовательный порт для связи. Если я запускаю его на переднем плане (то есть он не развивается), все работает нормально. Если я запускаю его как демон из командной строки, все тоже работает нормально.
Только запуск его в фоновом режиме как демона со стартовым скриптом во время загрузки всегда не может установить правильную скорость передачи данных. Кажется, что-то по умолчанию 115200 бит / с вместо того, что я настроил: 9600 бит / с.
Я использую стандартную структуру ‘termios’ и соответствующие функции для конфигурации последовательного порта. Последовательный порт является частью образа ядра, а не загружаемым модулем. Вот соответствующий код:
struct termios TermIO;
speed_t locBaudrate;
...
// retrieve current settings
if (tcgetattr(nFile, &TermIO)==-1) {
// failed to get attributes
return false;
}// initialize anything to 0
memset(&TermIO, 0, sizeof(TermIO));
// set the baudrate
locBaudrate= B9600;
if (cfsetispeed(&TermIO, locBaudrate)==-1) {
// failed to set the input baudrate
return false;
}
if (cfsetospeed(&TermIO, locBaudrate)==-1) {
// failed to set the output baudrate
return false;
}
... // more configuraton like stop, bitlen, etc
// set the new configuration immediately i.e. do not wait for Rx or Tx to finish
if (tcsetattr(nFile, TCSANOW, &TermIO)==-1) {
// failed to set parameters
return false;
}
Чтобы быть абсолютно ясным: я могу запустить программу как демон (то есть она будет разветвляться) из командной строки, и тогда все будет работать нормально. Именно когда программа запускается со скриптом в /etc/init.d во время запуска, конфигурация скорости передачи не удалась. Сама программа отлично работает в фоновом режиме.
Есть идеи, что тут может быть не так?
Задача ещё не решена.
Других решений пока нет …