2

我是 RTOS 的初学者,我正在使用 Xenomai v2.6.3。

我正在尝试使用串行通信获取一些数据。

我按照 xenomai 的指南和开源代码尽力完成了这项任务,但效果不佳。

指南的链接 --> ( 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(这意味着连接超时)

此外,我通过键入命令“cat /proc/xenomai/irq”检查了 irq number3,但中断号没有增加。就我而言,我不需要写入数据,因此我擦除了写入任务代码。

读取任务过程如下

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 不起作用....

我想检查这两件事是否有问题,但是我该如何检查?

此外,有人知道问题的原因吗?请给我意见。

4

0 回答 0