Последовательная связь Linux-Xenomai с использованием модуля xeno_16550A

Я начинаю RTOS и использую Xenomai v2.6.3.

Я пытаюсь получить некоторые данные, используя последовательную связь.

Я сделал все возможное для выполнения этой задачи, следуя руководству ксеномаи и открытым источникам, но это не работает хорошо.

ссылка на руководство -> ( https://xenomai.org//serial-16550a-driver/)

Я просто следовал последовательности, чтобы использовать модуль xeno_16550A. (с портом io = 0x2f8 и irq=3)

Я следовал с открытым исходным кодом http://www.acadis.org/pages/captain.at/serial-port-example

Это хорошо работает в задаче записи, но задача чтения не работает хорошо. Это дало мне предложение с ошибкой, в то время как RTSER_RTIOC_WAIT_EVENT, код -110 (это означает, что время подключения истекло)

Более того, я проверил irq number3, набрав команду "cat / proc / xenomai / irq", но номер прерывания не увеличивается. В моем случае мне не нужно записывать данные, поэтому я стираю код задачи записи.

Задание на чтение прочитано

void read_task_proc(void *arg) {
  int ret;
  ssize_t red = 0;
  struct rtser_event rx_event;

  while (1) {
    /* waiting for event */
    ret = rt_dev_ioctl(my_fd, RTSER_RTIOC_WAIT_EVENT, &rx_event );
    if (ret) {
      printf(RTASK_PREFIX "error while RTSER_RTIOC_WAIT_EVENT, code %d\n",ret);
      if (ret == -ETIMEDOUT)
              continue;
      break;
    }

    unsigned char buf[1];
    red = rt_dev_read(my_fd, &buf, 1);
      if (red < 0 ) {
        printf(RTASK_PREFIX "error while rt_dev_read, code %d\n",red);
      } else {
        printf(RTASK_PREFIX "only %d byte received , char : %c\n",red,buf[0]);
      }
  }
exit_read_task:
  if (my_state & STATE_FILE_OPENED) {
    if (!close_file( my_fd, READ_FILE " (rtser)")) {
      my_state &= ~STATE_FILE_OPENED;
    }
  }
  printf(RTASK_PREFIX "exit\n");
}

Я мог бы угадать причины проблемы.

  1. Размер буфера или буфер уже заполнен при получении новых данных.

  2. rx_interrupt не работает....

Я хочу проверить, правильны ли эти две вещи или нет, но как я могу проверить?

Кроме того, кто-нибудь знает причину проблемы? Пожалуйста, дайте мне комментарии.

0 ответов

Другие вопросы по тегам