打印
[嵌入式linux]

linux环境下串口接收数据的最高位总是0?

[复制链接]
2889|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
mxh0506|  楼主 | 2008-11-25 16:40 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
无论是在PC机上还是在ARM板上,都是如此,本应是0xff却收成了0x7f,何解?
下面是我的测试程序:
#include   <stdio.h>        /* 标准输入输出定义 */ 
#include   <stdlib.h>        /* 标准函数库定义 */ 
#include   <unistd.h>        /* Unix标准函数定义 */ 
#include   <sys/types.h> 
#include   <sys/stat.h> 
#include   <fcntl.h>        /* 文件控制定义 */ 
#include   <termios.h>    /* POSIX 终端控制定义 */ 
#include   <errno.h>        /* 错误号定义 */

/* 串口工作参数是硬编码的 */
int OpenUart(char *pDev, int iFlag)
{
    int   fd; 
    struct   termios   Opt; 
    /*以读写方式打开串口*/ 
    fd   =   open( pDev, iFlag ); 
    if ( -1 == fd ){ 
        perror("无法打开/dev/ttyS0,请检查该设备是否存在,及其访问权限 ");
        return -1;
    }else{
        fcntl(fd, F_SETFL, 0);
    }
    // 设置参数
    tcgetattr( fd, &Opt );
    cfsetispeed( &Opt, B38400 );    /* 设置为 38400 bps */ 
    cfsetospeed( &Opt, B38400 );    /* 只有很少的硬件支持输入/输出波特率不同 */
    Opt.c_cflag   |=    CLOCAL | CREAD;
    Opt.c_cflag   &=   ~CSIZE;
    Opt.c_cflag   |=   CS8;
    Opt.c_cflag   |=   ( PARODD | PARENB );   /* 设置为奇效验 */ 
    Opt.c_iflag   |=   INPCK | ISTRIP;    /* enable parity checking */
//Opt.c_cflag   &=   ~PARENB;
//Opt.c_iflag   &=   ~INPCK;
    Opt.c_cflag   &=   ~CSTOPB;    /* 1 stop bit */
    tcflush( fd, TCIOFLUSH );
    Opt.c_cc[VTIME]  =   15;        /* 设置超时 1.5 seconds */
    Opt.c_cc[VMIN]   =   0;        /* Update the options and do it NOW */
    /* for raw mode */
    Opt.c_lflag   &=   ~( ICANON | ECHO | ECHOE | ISIG );   /* Input */
    Opt.c_oflag   &=   ~OPOST;   /* Output */
//    Opt.c_cflag   &=   ~CNEW_RTSCTS; /* disable hw flow ctrl */

    if( 0 != tcsetattr( fd, TCSANOW, &Opt )){
        return -1;
    }else{
        return fd;
    }
}

int main(void)
{
    int fd,i,iCnt;
    char buff[16];
    fd = OpenUart("/dev/ttyS1", O_RDWR | O_NOCTTY | O_NDELAY);
    //fd = OpenUart("/dev/ttyS1", O_RDWR );

    if (-1 == fd ){
        return(-1);
    }else{
        printf("open ttyS1 ..... ");
    }

    fcntl(fd, F_SETFL, 0);    //恢复串口的状态为阻塞状态,用于等待串口数据的读入

    while(1)
    {
        do{
            iCnt = read(fd,buff,16);
        }while(iCnt == 0);
        for(i=0; i<iCnt; i++){
            printf("%02X,",buff);
        }
        printf(" ");
    }
    close(fd);
    return;
}

相关帖子

沙发
mxh0506|  楼主 | 2008-11-26 09:55 | 只看该作者

原来是LINUX固有的问题, 唉!

真不知道LINUX怎么会这样!
老外也同样没辙:
相关链接:http://forums.fedoraforum.org/showthread.php?t=147869

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

85

主题

1601

帖子

2

粉丝