我是 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");
}
我可以猜到问题的原因。
接收到新数据时缓冲区大小或缓冲区已满。
rx_interrupt 不起作用....
我想检查这两件事是否有问题,但是我该如何检查?
此外,有人知道问题的原因吗?请给我意见。