Hi there, ATTENTION: I'm a xenomai-newbie I want to read data from the serial device
I got the serial driver loop demo from http://www.captain.at/xenomai-serial-port-example.php It worked without any problems. Then I modified the demo to read data only (remove all the write_task stuff). But I get this error when I do a "echo 123 > /dev/ttyS0" on a other computer connected with a serial cable. > voyage:/usr/src/tests/getserial# ./getserial > rt_serial_uprog: PRESS CTRL-C to EXIT > rt_serial_uprog: timer started > rt_serial_uprog: rtser_file opened > rt_serial_uprog: serial-port-config written > rt_serial_uprog: read-task created > rt_serial_uprog: starting read-task > rt_serial_uprog: rtser0 (rtser) -> EAGAIN (1 times) > rt_serial_uprog: rtser0 (rtser) -> EAGAIN (2 times) > rt_serial_uprog: rtser0 (rtser) -> EAGAIN (3 times) > rt_serial_uprog: rtser0 (rtser) -> EAGAIN (4 times) > rt_serial_uprog: rtser0 (rtser) -> EAGAIN (5 times) > rt_serial_uprog: rtser0 (rtser) -> EAGAIN (6 times) > rt_serial_uprog: rtser0 (rtser) -> EAGAIN (7 times) > rt_serial_uprog: rtser0 (rtser) -> EAGAIN (8 times) > rt_serial_uprog: rtser0 (rtser) -> EAGAIN (9 times) > rt_serial_uprog: rtser0 (rtser) -> EAGAIN (10 times) > rt_serial_uprog: delete write_task > rt_serial_uprog: stop timer > rt_serial_uprog: exit and: > Mar 22 15:02:46 voyage kernel: 00000000 > Mar 22 15:02:46 voyage kernel: PREEMPT > Mar 22 15:02:46 voyage kernel: Modules linked in: xeno_16550A xeno_rtdm > ohci_hcd usbcore sis900 mii dm_mod > Mar 22 15:02:46 voyage kernel: CPU: 0 > Mar 22 15:02:46 voyage kernel: EIP: 0060:[<00000000>] Not tainted VLI > Mar 22 15:02:46 voyage kernel: EFLAGS: 00010002 (2.6.15.4-gx1-25) > Mar 22 15:02:46 voyage kernel: EIP is at _stext+0x3feffdc0/0xb4 > Mar 22 15:02:46 voyage kernel: eax: c0316b80 ebx: c03168e0 ecx: c03173a0 > edx: c03168e0 > Mar 22 15:02:46 voyage kernel: esi: 00000004 edi: c03168e8 ebp: c03173d0 > esp: cdc8ddd4 > Mar 22 15:02:46 voyage kernel: ds: 007b es: 007b ss: 0068 > Mar 22 15:02:46 voyage kernel: Process read_task (pid: 1320, > threadinfo=cdc8c000 task=ce951a50) > Mar 22 15:02:46 voyage kernel: Stack: c010c6ad 00000004 00000000 cffdf2fa > 00000048 c03173e0 00000000 c03168e0 > Mar 22 15:02:46 voyage kernel: ffffffff 00000001 00000000 00000002 > c03168e0 c03168e0 00000046 c012f6fe > Mar 22 15:02:46 voyage kernel: 018f7a35 00000048 00000000 00000000 > ffffffd5 ce84a110 d0054c07 c02482c6 > Mar 22 15:02:46 voyage kernel: Call Trace: > Mar 22 15:02:46 voyage kernel: [__ipipe_sync_stage+468/606] > __ipipe_sync_stage+0x1d4/0x25e > Mar 22 15:02:46 voyage kernel: [ipipe_unstall_pipeline_from+196/238] > ipipe_unstall_pipeline_from+0xc4/0xee > Mar 22 15:02:46 voyage kernel: [pg0+265423879/1070375936] > rtdm_event_timedwait+0x167/0x171 [xeno_rtdm] > Mar 22 15:02:46 voyage kernel: [tcp_v4_rcv+1295/2273] tcp_v4_rcv+0x50f/0x8e1 > Mar 22 15:02:46 voyage kernel: [pg0+265260884/1070375936] > rt_16550_ioctl+0x571/0x70e [xeno_16550A] > Mar 22 15:02:46 voyage kernel: [xnpod_announce_tick+83/164] > xnpod_announce_tick+0x53/0xa4 > Mar 22 15:02:46 voyage kernel: [xnintr_clock_handler+16/19] > xnintr_clock_handler+0x10/0x13 > Mar 22 15:02:46 voyage kernel: [__ipipe_sync_stage+468/606] > __ipipe_sync_stage+0x1d4/0x25e > Mar 22 15:02:46 voyage kernel: [pg0+265416973/1070375936] > rtdm_context_get+0x10d/0x116 [xeno_rtdm] > Mar 22 15:02:46 voyage kernel: [pg0+265418994/1070375936] > _rtdm_ioctl+0x3c/0x50 [xeno_rtdm] > Mar 22 15:02:46 voyage kernel: [pg0+265428189/1070375936] > sys_rtdm_ioctl+0x15/0x19 [xeno_rtdm] > Mar 22 15:02:46 voyage kernel: [hisyscall_event+521/768] > hisyscall_event+0x209/0x300 > Mar 22 15:02:46 voyage kernel: [__ipipe_dispatch_event+91/222] > __ipipe_dispatch_event+0x5b/0xde > Mar 22 15:02:46 voyage kernel: [__ipipe_syscall_root+78/186] > __ipipe_syscall_root+0x4e/0xba > Mar 22 15:02:46 voyage kernel: [system_call+32/65] system_call+0x20/0x41 > Mar 22 15:02:46 voyage kernel: Code: Bad EIP value. I think the error is in the following part: > void read_task_proc(void *arg) { > int ret; > // RTIME irq_time = 0; > ssize_t sz = sizeof(RTIME); > ssize_t red = 0; > struct rtser_event rx_event; > unsigned char buf[17]; > > // we are in secondary mode now > while (1) { > /* switch to primary mode */ > ret = rt_task_set_mode(0, T_PRIMARY, NULL); > if (ret) { > printf(RTASK_PREFIX "error while rt_task_set_mode, code %d\n",ret); > goto exit_read_task; > } > /* waiting for event */ > // be careful not to do printf or so here. Otherwise rt_dev_ioctl > // returns with an error, because we're not in hard real time > // anymore (primary mode) > 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); > goto exit_read_task; > } > //irq_time = rx_event.rxpend_timestamp; > sz = sizeof(buf); > red = rt_dev_read(my_fd, &buf, sizeof(buf)); > if (red == sz ) { > printf(RTASK_PREFIX "rt_dev_read=%s\n",buf); > } else { > if (red < 0 ) { > printf(RTASK_PREFIX "error while rt_dev_read, code %d\n",red); > } else { > printf(RTASK_PREFIX "only %d / %d byte received \n",red,sz); > } > goto exit_read_task; > } > } > 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"); > } When I use the kernel serial-drivers and do a "cat /dev/ttyS0" I get the data that I sent from the other computer Thanks Marco _______________________________________________ Xenomai-help mailing list [email protected] https://mail.gna.org/listinfo/xenomai-help
