当前位置: 技术问答>linux和unix
虚拟串口怎么读数据? 请有 串口 或者 usb 驱动经验的高手指点
来源: 互联网 发布时间:2016-05-12
本文导语: 我把usb虚拟成串口进行读写数据,驱动在linux源代码中找到为:/drivers/usb/class/cdc-acm.c 现在写数据成功,但读不到数据!也就是buffer没有单片机返回的数据,其驱动中串口接口为: struct tty_operations acm_ops = { .ope...
我把usb虚拟成串口进行读写数据,驱动在linux源代码中找到为:/drivers/usb/class/cdc-acm.c
现在写数据成功,但读不到数据!也就是buffer没有单片机返回的数据,其驱动中串口接口为:
struct tty_operations acm_ops = {
.open = acm_tty_open,
.close = acm_tty_close,
.write = acm_tty_write,
.write_room = acm_tty_write_room,
.ioctl = acm_tty_ioctl,
.throttle = acm_tty_throttle,
.unthrottle = acm_tty_unthrottle,
.chars_in_buffer = acm_tty_chars_in_buffer,
.break_ctl = acm_tty_break_ctl,
.set_termios = acm_tty_set_termios,
.tiocmget = acm_tty_tiocmget,
.tiocmset = acm_tty_tiocmset,
}
没有找到read()函数,在一般的串口驱动中也没有read()函数,那要怎么才能读到数据?
现在写数据成功,但读不到数据!也就是buffer没有单片机返回的数据,其驱动中串口接口为:
struct tty_operations acm_ops = {
.open = acm_tty_open,
.close = acm_tty_close,
.write = acm_tty_write,
.write_room = acm_tty_write_room,
.ioctl = acm_tty_ioctl,
.throttle = acm_tty_throttle,
.unthrottle = acm_tty_unthrottle,
.chars_in_buffer = acm_tty_chars_in_buffer,
.break_ctl = acm_tty_break_ctl,
.set_termios = acm_tty_set_termios,
.tiocmget = acm_tty_tiocmget,
.tiocmset = acm_tty_tiocmset,
}
没有找到read()函数,在一般的串口驱动中也没有read()函数,那要怎么才能读到数据?
|
acm_probe 中会注册一个 tasklet:
acm->urb_task.func = acm_rx_tasklet;
该 tasklet 会从 usb 接收缓冲里获取数据, 再发送到tty中间层:
417 if (!throttled)
418 tty_insert_flip_string(tty, buf->base, buf->size);
419 tty_flip_buffer_push(tty);
而usb 这边则是由 acm_read_bulk函数来填充接收缓冲。
ldd3(http://lwn.net/Kernel/LDD3/, 串口这块有点过时) 也说明了为什么串口
驱动没有read 函数:普通的串口驱动是在中断处理函数中直接调用 tty 中间层
的函数(tty_intert_*, tty_flip_*)将数据发送到 tty buffer中的,本身不提
供buffer/同步机制。
以下几个文档不错:
http://www.linuxjournal.com/article/5896 (No Read 一节解释了你的困惑)
http://www.linuxjournal.com/article/6434
http://www.linuxjournal.com/article/6573
acm->urb_task.func = acm_rx_tasklet;
该 tasklet 会从 usb 接收缓冲里获取数据, 再发送到tty中间层:
417 if (!throttled)
418 tty_insert_flip_string(tty, buf->base, buf->size);
419 tty_flip_buffer_push(tty);
而usb 这边则是由 acm_read_bulk函数来填充接收缓冲。
ldd3(http://lwn.net/Kernel/LDD3/, 串口这块有点过时) 也说明了为什么串口
驱动没有read 函数:普通的串口驱动是在中断处理函数中直接调用 tty 中间层
的函数(tty_intert_*, tty_flip_*)将数据发送到 tty buffer中的,本身不提
供buffer/同步机制。
以下几个文档不错:
http://www.linuxjournal.com/article/5896 (No Read 一节解释了你的困惑)
http://www.linuxjournal.com/article/6434
http://www.linuxjournal.com/article/6573
|
我基本上明白你的意思了,返回的数据经过buf->base,发送到了acm->filled_read_bufs
应用程序对驱动的操作只能通过tty_operations 里的函数吧? 要不要修改驱动?
能告诉我详细点吗?
我具体还要做哪些工作才能在应用程序中读到返回的数据?
tty_operations 只是用来给 tty 中间层提供接口的。应用层进行tcsetattr后通过标准 read/write函数进行串口读写。
不是特别明白你的意思。 我认为 usb 转串口等 class 驱动不需要任何修改就可以工作。这是成熟的代码。
当然你要保证usb控制器驱动是正常的。也要保证外面接的那个 usb device 在正常工作。
应用程序对驱动的操作只能通过tty_operations 里的函数吧? 要不要修改驱动?
能告诉我详细点吗?
我具体还要做哪些工作才能在应用程序中读到返回的数据?
tty_operations 只是用来给 tty 中间层提供接口的。应用层进行tcsetattr后通过标准 read/write函数进行串口读写。
不是特别明白你的意思。 我认为 usb 转串口等 class 驱动不需要任何修改就可以工作。这是成熟的代码。
当然你要保证usb控制器驱动是正常的。也要保证外面接的那个 usb device 在正常工作。
|
我也遇到这个问题
是不是数据直接保存在tty中的*driver_data?
还是*disc_data?
在应用程序直接调用tty->driver_data 或者tty->disk_data 就可以显示数据了?
是不是数据直接保存在tty中的*driver_data?
还是*disc_data?
在应用程序直接调用tty->driver_data 或者tty->disk_data 就可以显示数据了?