mxh0506 发表于 2008-11-25 16:40

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

无论是在PC机上还是在ARM板上,都是如此,本应是0xff却收成了0x7f,何解?<br />下面是我的测试程序:<br />#include&nbsp;&nbsp;&nbsp;&ltstdio.h&gt&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;标准输入输出定义&nbsp;*/&nbsp;<br />#include&nbsp;&nbsp;&nbsp;&ltstdlib.h&gt&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;标准函数库定义&nbsp;*/&nbsp;<br />#include&nbsp;&nbsp;&nbsp;&ltunistd.h&gt&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;Unix标准函数定义&nbsp;*/&nbsp;<br />#include&nbsp;&nbsp;&nbsp;&ltsys/types.h&gt&nbsp;<br />#include&nbsp;&nbsp;&nbsp;&ltsys/stat.h&gt&nbsp;<br />#include&nbsp;&nbsp;&nbsp;&ltfcntl.h&gt&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;文件控制定义&nbsp;*/&nbsp;<br />#include&nbsp;&nbsp;&nbsp;&lttermios.h&gt&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;POSIX&nbsp;终端控制定义&nbsp;*/&nbsp;<br />#include&nbsp;&nbsp;&nbsp;&lterrno.h&gt&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;错误号定义&nbsp;*/<br /><br />/*&nbsp;串口工作参数是硬编码的&nbsp;*/<br />int&nbsp;OpenUart(char&nbsp;*pDev,&nbsp;int&nbsp;iFlag)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;&nbsp;&nbsp;fd;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;struct&nbsp;&nbsp;&nbsp;termios&nbsp;&nbsp;&nbsp;Opt;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;/*以读写方式打开串口*/&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;fd&nbsp;&nbsp;&nbsp;=&nbsp;&nbsp;&nbsp;open(&nbsp;pDev,&nbsp;iFlag&nbsp;);&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(&nbsp;-1&nbsp;==&nbsp;fd&nbsp;){&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;perror(&quot;无法打开/dev/ttyS0,请检查该设备是否存在,及其访问权限
&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;-1;<br />&nbsp;&nbsp;&nbsp;&nbsp;}else{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fcntl(fd,&nbsp;F_SETFL,&nbsp;0);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;设置参数<br />&nbsp;&nbsp;&nbsp;&nbsp;tcgetattr(&nbsp;fd,&nbsp;&Opt&nbsp;);<br />&nbsp;&nbsp;&nbsp;&nbsp;cfsetispeed(&nbsp;&Opt,&nbsp;B38400&nbsp;);&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;设置为&nbsp;38400&nbsp;bps&nbsp;*/&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;cfsetospeed(&nbsp;&Opt,&nbsp;B38400&nbsp;);&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;只有很少的硬件支持输入/输出波特率不同&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;Opt.c_cflag&nbsp;&nbsp;&nbsp;|=&nbsp;&nbsp;&nbsp;&nbsp;CLOCAL&nbsp;|&nbsp;CREAD;<br />&nbsp;&nbsp;&nbsp;&nbsp;Opt.c_cflag&nbsp;&nbsp;&nbsp;&=&nbsp;&nbsp;&nbsp;~CSIZE;<br />&nbsp;&nbsp;&nbsp;&nbsp;Opt.c_cflag&nbsp;&nbsp;&nbsp;|=&nbsp;&nbsp;&nbsp;CS8;<br />&nbsp;&nbsp;&nbsp;&nbsp;Opt.c_cflag&nbsp;&nbsp;&nbsp;|=&nbsp;&nbsp;&nbsp;(&nbsp;PARODD&nbsp;|&nbsp;PARENB&nbsp;);&nbsp;&nbsp;&nbsp;/*&nbsp;设置为奇效验&nbsp;*/&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;Opt.c_iflag&nbsp;&nbsp;&nbsp;|=&nbsp;&nbsp;&nbsp;INPCK&nbsp;|&nbsp;ISTRIP;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;enable&nbsp;parity&nbsp;checking&nbsp;*/<br />//Opt.c_cflag&nbsp;&nbsp;&nbsp;&=&nbsp;&nbsp;&nbsp;~PARENB;<br />//Opt.c_iflag&nbsp;&nbsp;&nbsp;&=&nbsp;&nbsp;&nbsp;~INPCK;<br />&nbsp;&nbsp;&nbsp;&nbsp;Opt.c_cflag&nbsp;&nbsp;&nbsp;&=&nbsp;&nbsp;&nbsp;~CSTOPB;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;1&nbsp;stop&nbsp;bit&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;tcflush(&nbsp;fd,&nbsp;TCIOFLUSH&nbsp;);<br />&nbsp;&nbsp;&nbsp;&nbsp;Opt.c_cc&nbsp;&nbsp;=&nbsp;&nbsp;&nbsp;15;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;设置超时&nbsp;1.5&nbsp;seconds&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;Opt.c_cc&nbsp;&nbsp;&nbsp;=&nbsp;&nbsp;&nbsp;0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;Update&nbsp;the&nbsp;options&nbsp;and&nbsp;do&nbsp;it&nbsp;NOW&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;for&nbsp;raw&nbsp;mode&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;Opt.c_lflag&nbsp;&nbsp;&nbsp;&=&nbsp;&nbsp;&nbsp;~(&nbsp;ICANON&nbsp;|&nbsp;ECHO&nbsp;|&nbsp;ECHOE&nbsp;|&nbsp;ISIG&nbsp;);&nbsp;&nbsp;&nbsp;/*&nbsp;Input&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;Opt.c_oflag&nbsp;&nbsp;&nbsp;&=&nbsp;&nbsp;&nbsp;~OPOST;&nbsp;&nbsp;&nbsp;/*&nbsp;Output&nbsp;*/<br />//&nbsp;&nbsp;&nbsp;&nbsp;Opt.c_cflag&nbsp;&nbsp;&nbsp;&=&nbsp;&nbsp;&nbsp;~CNEW_RTSCTS;&nbsp;/*&nbsp;disable&nbsp;hw&nbsp;flow&nbsp;ctrl&nbsp;*/<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;if(&nbsp;0&nbsp;!=&nbsp;tcsetattr(&nbsp;fd,&nbsp;TCSANOW,&nbsp;&Opt&nbsp;)){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;-1;<br />&nbsp;&nbsp;&nbsp;&nbsp;}else{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;fd;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br /><br />int&nbsp;main(void)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;fd,i,iCnt;<br />&nbsp;&nbsp;&nbsp;&nbsp;char&nbsp;buff;<br />&nbsp;&nbsp;&nbsp;&nbsp;fd&nbsp;=&nbsp;OpenUart(&quot;/dev/ttyS1&quot;,&nbsp;O_RDWR&nbsp;|&nbsp;O_NOCTTY&nbsp;|&nbsp;O_NDELAY);<br />&nbsp;&nbsp;&nbsp;&nbsp;//fd&nbsp;=&nbsp;OpenUart(&quot;/dev/ttyS1&quot;,&nbsp;O_RDWR&nbsp;);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(-1&nbsp;==&nbsp;fd&nbsp;){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return(-1);<br />&nbsp;&nbsp;&nbsp;&nbsp;}else{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;open&nbsp;ttyS1&nbsp;.....
&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;fcntl(fd,&nbsp;F_SETFL,&nbsp;0);&nbsp;&nbsp;&nbsp;&nbsp;//恢复串口的状态为阻塞状态,用于等待串口数据的读入<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;while(1)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;do{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;iCnt&nbsp;=&nbsp;read(fd,buff,16);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}while(iCnt&nbsp;==&nbsp;0);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(i=0;&nbsp;i&ltiCnt;&nbsp;i++){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;%02X,&quot;,buff);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;
&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;close(fd);<br />&nbsp;&nbsp;&nbsp;&nbsp;return;<br />}<br />http://t3.baidu.com/it/u=3247952378,3047224546&fm=0&gp=0.jpg

mxh0506 发表于 2008-11-26 09:55

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

真不知道LINUX怎么会这样!<br />老外也同样没辙: <br /> 相关链接:<a href='http://forums.fedoraforum.org/showthread.php?t=147869'>http://forums.fedoraforum.org/showthread.php?t=147869</a>
页: [1]
查看完整版本: linux环境下串口接收数据的最高位总是0?