linux环境下串口接收数据的最高位总是0?
无论是在PC机上还是在ARM板上,都是如此,本应是0xff却收成了0x7f,何解?<br />下面是我的测试程序:<br />#include <stdio.h> /* 标准输入输出定义 */ <br />#include <stdlib.h> /* 标准函数库定义 */ <br />#include <unistd.h> /* Unix标准函数定义 */ <br />#include <sys/types.h> <br />#include <sys/stat.h> <br />#include <fcntl.h> /* 文件控制定义 */ <br />#include <termios.h> /* POSIX 终端控制定义 */ <br />#include <errno.h> /* 错误号定义 */<br /><br />/* 串口工作参数是硬编码的 */<br />int OpenUart(char *pDev, int iFlag)<br />{<br /> int fd; <br /> struct termios Opt; <br /> /*以读写方式打开串口*/ <br /> fd = open( pDev, iFlag ); <br /> if ( -1 == fd ){ <br /> perror("无法打开/dev/ttyS0,请检查该设备是否存在,及其访问权限");<br /> return -1;<br /> }else{<br /> fcntl(fd, F_SETFL, 0);<br /> }<br /> // 设置参数<br /> tcgetattr( fd, &Opt );<br /> cfsetispeed( &Opt, B38400 ); /* 设置为 38400 bps */ <br /> cfsetospeed( &Opt, B38400 ); /* 只有很少的硬件支持输入/输出波特率不同 */<br /> Opt.c_cflag |= CLOCAL | CREAD;<br /> Opt.c_cflag &= ~CSIZE;<br /> Opt.c_cflag |= CS8;<br /> Opt.c_cflag |= ( PARODD | PARENB ); /* 设置为奇效验 */ <br /> Opt.c_iflag |= INPCK | ISTRIP; /* enable parity checking */<br />//Opt.c_cflag &= ~PARENB;<br />//Opt.c_iflag &= ~INPCK;<br /> Opt.c_cflag &= ~CSTOPB; /* 1 stop bit */<br /> tcflush( fd, TCIOFLUSH );<br /> Opt.c_cc = 15; /* 设置超时 1.5 seconds */<br /> Opt.c_cc = 0; /* Update the options and do it NOW */<br /> /* for raw mode */<br /> Opt.c_lflag &= ~( ICANON | ECHO | ECHOE | ISIG ); /* Input */<br /> Opt.c_oflag &= ~OPOST; /* Output */<br />// Opt.c_cflag &= ~CNEW_RTSCTS; /* disable hw flow ctrl */<br /><br /> if( 0 != tcsetattr( fd, TCSANOW, &Opt )){<br /> return -1;<br /> }else{<br /> return fd;<br /> }<br />}<br /><br />int main(void)<br />{<br /> int fd,i,iCnt;<br /> char buff;<br /> fd = OpenUart("/dev/ttyS1", O_RDWR | O_NOCTTY | O_NDELAY);<br /> //fd = OpenUart("/dev/ttyS1", O_RDWR );<br /><br /> if (-1 == fd ){<br /> return(-1);<br /> }else{<br /> printf("open ttyS1 .....
");<br /> }<br /><br /> fcntl(fd, F_SETFL, 0); //恢复串口的状态为阻塞状态,用于等待串口数据的读入<br /><br /> while(1)<br /> {<br /> do{<br /> iCnt = read(fd,buff,16);<br /> }while(iCnt == 0);<br /> for(i=0; i<iCnt; i++){<br /> printf("%02X,",buff);<br /> }<br /> printf("
");<br /> }<br /> close(fd);<br /> return;<br />}<br />http://t3.baidu.com/it/u=3247952378,3047224546&fm=0&gp=0.jpg
原来是LINUX固有的问题, 唉!
真不知道LINUX怎么会这样!<br />老外也同样没辙: <br /> 相关链接:<a href='http://forums.fedoraforum.org/showthread.php?t=147869'>http://forums.fedoraforum.org/showthread.php?t=147869</a>
页:
[1]