3185|1

70

帖子

0

TA的资源

一粒金砂(高级)

楼主
 

tty驱动问题 [复制链接]

请教高手,
linux驱动中使用tty_insert_flip_string(返回值正确),并tty_flip_buffer_push(tty);
但是在read时无法读取到数据,这是为什么?

3x

最新回复

            if (!tty->icanon && (tty->read_cnt >= tty->minimum_to_wake)) {                 kill_fasync(&tty->fasync, SIGIO, POLL_IN);                 if (waitqueue_active(&tty->read_wait))                         wake_up_interruptible(&tty->read_wait);         } 看看你的串口参数怎么设置的,有可能没有达到你设置接受到字节数目,所以没有唤醒你来接收 注意options.c_cc[VTIME] = 10;         options.c_cc[VMIN] = AcmGetPortRxBufferSize(DIAG_PORT) / 2; 这两个参数的设置。 static boolean AcmConfigPort(int fd, AcmPortType port) {     struct termios options;     if ( tcgetattr( fd,&options) != 0)     {         perror("tcgetattr");         return FALSE;     }     /*使能接收,并设置本地状态*/     options.c_cflag |= (CLOCAL | CREAD);     /*波特率设置115200*/     cfsetispeed(&options, B115200);     cfsetospeed(&options, B115200);            /*无校验位(8N1)*/     options.c_cflag &= ~PARENB;        options.c_cflag &= ~CSTOPB;       options.c_cflag &= ~CSIZE;        options.c_cflag |= CS8;     options.c_iflag &= ~INPCK;             /*原始输入*/     options.c_lflag  &= ~(ICANON | ECHO | ECHOE | ISIG);     options.c_iflag &= ~( INLCR | IGNCR| ICRNL |IUCLC);     /*关闭流控*/     options.c_cflag &= ~CRTSCTS;       options.c_iflag &= ~(IXON | IXOFF | IXANY);         /*原始输出*/     options.c_oflag  &= ~OPOST;   /*Output*/     /*读超时值设定*/     switch (port)     {     case UI_PORT:         options.c_cc[VTIME] = 0;         options.c_cc[VMIN] = 0;         break;              case MODEM_PORT:            options.c_cc[VTIME] = 0;         options.c_cc[VMIN] = 0;         break;              case DIAG_PORT:            options.c_cc[VTIME] = 10;         options.c_cc[VMIN] = AcmGetPortRxBufferSize(DIAG_PORT) / 2;         break;     default:         assert(FALSE);         break;     }         /* Update the options and do it NOW */     tcflush(fd,TCIFLUSH);     if (tcsetattr(fd,TCSANOW,&options) != 0)     {        perror("tcsetattr");        return FALSE;     }         return TRUE; }   详情 回复 发表于 2010-6-30 16:49
点赞 关注

回复
举报

74

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
   
        if (!tty->icanon && (tty->read_cnt >= tty->minimum_to_wake)) {
                kill_fasync(&tty->fasync, SIGIO, POLL_IN);
                if (waitqueue_active(&tty->read_wait))
                        wake_up_interruptible(&tty->read_wait);
        }

看看你的串口参数怎么设置的,有可能没有达到你设置接受到字节数目,所以没有唤醒你来接收
注意options.c_cc[VTIME] = 10;
        options.c_cc[VMIN] = AcmGetPortRxBufferSize(DIAG_PORT) / 2;
这两个参数的设置。
static boolean AcmConfigPort(int fd, AcmPortType port)
{
    struct termios options;

    if ( tcgetattr( fd,&options) != 0)
    {
        perror("tcgetattr");
        return FALSE;
    }

    /*使能接收,并设置本地状态*/
    options.c_cflag |= (CLOCAL | CREAD);

    /*波特率设置115200*/
    cfsetispeed(&options, B115200);
    cfsetospeed(&options, B115200);   
   
    /*无校验位(8N1)*/
    options.c_cflag &= ~PARENB;   
    options.c_cflag &= ~CSTOPB;  
    options.c_cflag &= ~CSIZE;   
    options.c_cflag |= CS8;
    options.c_iflag &= ~INPCK;     
  
    /*原始输入*/
    options.c_lflag  &= ~(ICANON | ECHO | ECHOE | ISIG);
    options.c_iflag &= ~( INLCR | IGNCR| ICRNL |IUCLC);

    /*关闭流控*/
    options.c_cflag &= ~CRTSCTS;  
    options.c_iflag &= ~(IXON | IXOFF | IXANY);
   
    /*原始输出*/
    options.c_oflag  &= ~OPOST;   /*Output*/

    /*读超时值设定*/
    switch (port)
    {
    case UI_PORT:
        options.c_cc[VTIME] = 0;
        options.c_cc[VMIN] = 0;
        break;
        
    case MODEM_PORT:   
        options.c_cc[VTIME] = 0;
        options.c_cc[VMIN] = 0;
        break;
        
    case DIAG_PORT:   
        options.c_cc[VTIME] = 10;
        options.c_cc[VMIN] = AcmGetPortRxBufferSize(DIAG_PORT) / 2;
        break;
    default:
        assert(FALSE);
        break;
    }
   
    /* Update the options and do it NOW */
    tcflush(fd,TCIFLUSH);
    if (tcsetattr(fd,TCSANOW,&options) != 0)
    {
       perror("tcsetattr");
       return FALSE;
    }
   
    return TRUE;
}
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表