Последовательная связь 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");
}
Я мог бы угадать причины проблемы.
Размер буфера или буфер уже заполнен при получении новых данных.
rx_interrupt не работает....
Я хочу проверить, правильны ли эти две вещи или нет, но как я могу проверить?
Кроме того, кто-нибудь знает причину проблемы? Пожалуйста, дайте мне комментарии.