#c #serial-port #vxworks
Вопрос:
Я общаюсь с Автоматической системой наземной навигации по последовательному каналу, в котором я буду отдавать ей команды и получать от нее в ответ требуемый ответ. Так как сообщения заканчиваются на rn, как и в GPS (стандарт NMEA) Я открываю последовательный порт в линейном режиме. Проблема, с которой я сталкиваюсь, заключается в том, что если я попытаюсь отправить данные с более высокой скоростью, программа зависнет. На данный момент я очищаю как входной, так и выходной буферы в качестве решения этой проблемы. У кого-нибудь есть лучшее решение? Вот как я открываю свой последовательный порт:
#include <iostream>
#include <chrono>
#include <cstring>
#include <fcntl.h>
#include <unistd.h>
#include <sioLib.h>
#include <tyLib.h>
int fd = -1;
void recvthread() {
fd = open("/tyCo/2", O_RDWR | O_NOCTTY, 0);
if (fd != -1) {
int nRes = ioctl(fd, FIOBAUDRATE, 9600);
if (nRes == -1)
perror("Error in setting Baudrate for /tyCo/2");
int options = ioctl(fd, FIOGETOPTIONS, 0);
if (options == -1)
options = 0;
options |= CREAD | CLOCAL;
options amp;= ~CSIZE;
options |= CS8;
options amp;= ~STOPB;
options amp;= ~PARENB;
options |= OPT_LINE;
nRes = ioctl(fd, FIOSETOPTIONS, options);
if (nRes == -1)
perror("Error in setting options for /tyCo/2");
char buff[512];
while (true) {
// receive data
int len = read(fd, buff, 10);
// process the received data
}
}
}
int main() {
std::thread t(recvthread);
sleep(5);
char buff[512];
while (true) {
int len = write(fd, buff, 56);
std::this_thread::sleep_for(std::chrono::milliseconds(250LL));
}
}
Я использую плату Curtiss Wright 185, на которой установлена последовательная карта xmc 371, в качестве аксессуара, для которого я использую последовательный драйвер tews.
Комментарии:
1. Соответствует ли исходный код программы, написанный в статье, реальной ситуации? Похоже, что процесс записи, который выдает команду, происходит без какого-либо временного интервала. Не нужно ли спать или ждать уведомления по таймеру в цикле while?
2. @kunif Вы можете предположить, что промежуток в 250 миллисекунд между последовательными
write
вызовами составляет3. Не слишком ли короткий интервал? Почему бы не попробовать увеличить интервал? Или вам всегда нужно получать информацию? Например, существует ли режим, в котором уведомление выдается только при изменении? Пожалуйста, попробуйте разные вещи.
4. @kunif, но я не понимаю причину такого поведения в подвешенном состоянии?
5. Чтобы понять это, необходимо понять технические характеристики платы процессора и драйвера устройства под управлением VxWorks, а также технические характеристики связи и команд/ответов подключенного устройства. И если вам нужны советы или ответы, вам нужно будет представить их в своей статье с вопросами.