программа зависает при отправке последовательных данных в VxWorks

#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, а также технические характеристики связи и команд/ответов подключенного устройства. И если вам нужны советы или ответы, вам нужно будет представить их в своей статье с вопросами.