当前位置: 技术问答>linux和unix
tty设备驱动问题--为什么设备会把接收到的数据又发送出去?详细见内
来源: 互联网 发布时间:2016-01-16
本文导语: 调试设备时,发现没有对设备发送数据,但设备的接收端总会收到一些数据。 跟踪发现无用数据是linux-2.4.19/drivers/char/serial.c里的rs_put_char函数写进xmit.buf,最后被中断函数发送出去的。 而这些无用数据恰好是从设备...
调试设备时,发现没有对设备发送数据,但设备的接收端总会收到一些数据。
跟踪发现无用数据是linux-2.4.19/drivers/char/serial.c里的rs_put_char函数写进xmit.buf,最后被中断函数发送出去的。
而这些无用数据恰好是从设备接收来的数据。为什么会这样呢?
n_tty.c中似乎有对rs_put_char函数的间接调用,原理是什么呢?rs_put_char原本应该是应用程序调用的啊……迷糊中……
如何让rs_put_char函数只发送应用程序传给设备的数据呢?
望高手指教……
static void rs_put_char(struct tty_struct *tty, unsigned char ch)
{
struct async_struct *info = (struct async_struct *)tty->driver_data;
unsigned long flags;
if (serial_paranoia_check(info, tty->device, "rs_put_char"))
return;
if (!tty || !info->xmit.buf)
return;
save_flags(flags); cli();
if (CIRC_SPACE(info->xmit.head,
info->xmit.tail,
SERIAL_XMIT_SIZE) == 0) {
restore_flags(flags);
return;
}
info->xmit.buf[info->xmit.head] = ch;
info->xmit.head = (info->xmit.head + 1) & (SERIAL_XMIT_SIZE-1);
restore_flags(flags);
}
跟踪发现无用数据是linux-2.4.19/drivers/char/serial.c里的rs_put_char函数写进xmit.buf,最后被中断函数发送出去的。
而这些无用数据恰好是从设备接收来的数据。为什么会这样呢?
n_tty.c中似乎有对rs_put_char函数的间接调用,原理是什么呢?rs_put_char原本应该是应用程序调用的啊……迷糊中……
如何让rs_put_char函数只发送应用程序传给设备的数据呢?
望高手指教……
static void rs_put_char(struct tty_struct *tty, unsigned char ch)
{
struct async_struct *info = (struct async_struct *)tty->driver_data;
unsigned long flags;
if (serial_paranoia_check(info, tty->device, "rs_put_char"))
return;
if (!tty || !info->xmit.buf)
return;
save_flags(flags); cli();
if (CIRC_SPACE(info->xmit.head,
info->xmit.tail,
SERIAL_XMIT_SIZE) == 0) {
restore_flags(flags);
return;
}
info->xmit.buf[info->xmit.head] = ch;
info->xmit.head = (info->xmit.head + 1) & (SERIAL_XMIT_SIZE-1);
restore_flags(flags);
}
|
Linux的串口默认是调试模式的,它就是接到你发出的数据然后回传,设下相应的参数就可以关掉这种模式