Я использую вызов select для связи с внешней подсистемой (протокол для нее был предоставлен и реализован как поток Qt) через последовательный порт RS232. У нас нет аппаратного обеспечения для внешних систем, и поэтому мы разработали собственные симуляторы, использующие .Net 2.0 и C #, чтобы имитировать поведение базового оборудования подсистемы. Есть 5 разных подсистем, которые общаются с нашим приложением. Каждый интерфейс для подсистемы реализован как поток Qt. Поскольку это не приложение реального времени, и у нас нет реального оборудования, когда мы общаемся с помощью симуляторов, все системы находят работу в течение 24 часов или около того, и после этого связь идет вверх и вниз, и, в конечном счете, вся связь прерывается, когда я перезагружаю тренажер без закрытия приложения, все становится хорошо. Почему это происходит?
Полагаю, поскольку .Net / C # не является платформой реального времени, а также после того, как симуляторы работают в течение 24 часов, скорость отправки данных начинает снижаться, что вызывает засорение последовательных портов; перезапуск сбрасывает все и, таким образом, все возвращается в нормальное состояние. Это всего лишь предположение. Если у кого-то есть лучшее мнение, поделитесь им. Обратите внимание, что симуляторы были сделаны другой командой .Net парней.
Примечание. Каждый протокол имеет разные скорости передачи данных: 1 Гц, 5 Гц, 10 Гц.
Существует одна система, которая просто не возобновляет связь даже после того, как симулятор перезапускается после перезагрузки. Конфигурация порта для этой системы
SetPortConfiguration()
{
tcgetattr(Fd,&mOldtio);
mNewtio.c_cflag = B4800 | CS8 | CLOCAL | CREAD | CRTSCTS;
mNewtio.c_iflag = 0; //setting the input flag to icrnl causes a blank frame to be displayed after every frame.
mNewtio.c_oflag = 0;
mNewtio.c_lflag =ICANON;
mNewtio.c_cflag &=~PARENB;
mNewtio.c_cflag &= ~CSTOPB;
//mNewtio.c_cflag &= ~HUPCL; //added on 24/3/09
mNewtio.c_cc[VEOL]=0; //setting VEOL to '\r' or '\n' causes a blank frame to be displayed after every frame.
mNewtio.c_cc[VKILL] = 0; /* @ */
mNewtio.c_cc[VSTART] = 0; /* Ctrl-q */
mNewtio.c_cc[VSTOP] = 0; /* Ctrl-s */
mNewtio.c_cc[VMIN]=0;
mNewtio.c_cc[VTIME]=0;
tcflush(Fd, TCIFLUSH);
tcflow(Fd,TCION);
tcsetattr(Fd,TCSANOW,&mNewtio);
}
Также есть функция сброса порта:
ResetPort()
{
tcflush(Fd, TCIFLUSH); //flush all data received but not read
tcflow(Fd,TCIOFF); //transmits a STOP character, which stops the terminal device from transmitting data to the system
tcsetattr(Fd, TCSANOW, &mOldtio);//set the old terminal settings
ClosePort(); //close port
OpenPort(mStrPortNo); //open the port specified by port number and in read mode
SetPortConfiguration();
}
Если есть какой-либо разрыв в коммуникации, я вызываю функцию ResetPort, которая закрывает и снова открывает порт. Это решает проблему во всех случаях, кроме одной системы, скажем, XYZ.
Система XYZ отправляет данные в формате NMEA с каждым пакетом в виде строки данных, оканчивающейся комбинацией возврата каретки, LineFeed.
Кто-нибудь знает, в чем может быть проблема?