有修改过Linux下串pci串行口驱动动的大侠吗

中国领先的IT技术网站
51CTO旗下网站
Linux串口IO模式的一些心得
众所周知,在Linux系统下所有设备都是以文件的形式存在,串口也一样。通常I/O操作都是有阻塞与非阻塞的两种方式……
作者:等灯等灯来源:等灯等灯的博客| 09:25
众所周知,在Linux系统下所有设备都是以文件的形式存在,串口也一样。
通常I/O操作都是有阻塞与非阻塞的两种方式。
其中&超时&这个概念其实是阻塞中的一种处理手段,本质还是属于阻塞的I/O模式.
在Linux中串口的IO操作 本文将它分为三种状态:
非阻塞状态
这三种状态的转换组合有这么几种:
阻塞 --& 超时
阻塞 --& 非阻塞
超时 --& 阻塞
超时 --& 非阻塞
非阻塞 --& 阻塞
我们一个一个来分析
首先在一个串口的描述符打开的时候指定它的模式是阻塞还是阻塞
fd&=&open(&/dev/tttyS0&,O_RDWR&|&O_NOCTTY);//以阻塞模式打开串口 &fd&=&open(&/dev/tttyS0&,O_RDWR&|&O_NOCTTY&|&O_NDELAY);//以非阻塞模式打开串口 &//O_NDELAY&等价于&O_NOBLOCK&
当一个串口是阻塞状态的时候便可以设置它为超时状态。
利用 struct termios 的 cc_t c_cc[NCCS] 成员
c_cc[VTIME] 非规范模式读取时的超时时间(单位:百毫秒)
c_cc[VMIN] 非规范模式读取时的最小字符数
如需需要设置超时则c_cc[VMIN] 必须等于0。这代表能够读取的最小字符是0个,即使用read读取数据超时read返回0
有一个需要注意的地方!
当c_cc[VTIME] 设置为 0 且 c_cc[VMIN] == 0 的时候,代表超时0秒(姑且这么叫吧!)这个时候使用read读取数据会立即返回(有读到数据时返回字节数,没有数据和一般超时一样返回0)但是,虽然这时候在现象上看起来和非阻塞模式一样(read都不会阻塞)但返回值不同
非阻塞模式: read没有读到数据立即返回-1
超时0秒时: read没有读到数据立即返回 0 (设置了超时的阻塞模式)
ret&=&read(fd,recvbuf,BUF_SIZE); &if(ret&==&-1)//非阻塞模式时&无数据返回& &{ &//do&something &} &ret&=&read(fd,recvbuf,BUF_SIZE); &if(ret&==&0)//阻塞模式设置超时0秒时&超时返回& &{ &//do&something &}&
虽然表现形式一样,但在编程时必须要了解自己使用的是哪一种模式和串口当前的状态才能更好的分析和处理问题。
这里说一下我曾经遇到过的一个问题:
我在打开串口时使用阻塞模式打开,但是没有设置c_cc[VMIN]的值,而它初始化后就是0,所以发现串口没有被阻塞,其实原因就是串口模式还是阻塞模式没错,但是它是超时0秒的状态,所以在没有数据到达时read也返回了。
阻塞状态和非阻塞状态的切换
非阻塞状态时使用
fcntl(fd,F_SETFL,0);&
即可转换成阻塞状态,同样可以设置超时
当非阻塞状态已经设置了超时时,在转换成阻塞状态后超时也随同生效
阻塞状态时使用
fcntl(fd,F_SETFL,FNDELAY); &//FNDELAY等价于FNONBLOCK&
即可转换成非阻塞状态,超时失效
这里提一下 fcntl.h中几个宏的定义
/*&Define&some&more&compatibility&macros&to&be&backward&compatible&with &BSD&systems&which&did&not&managed&to&hide&these&kernel&macros.&*/ &#ifdef&__USE_BSD &#&define&FAPPEND&O_APPEND &#&define&FFSYNC&O_FSYNC &#&define&FASYNC&O_ASYNC &#&define&FNONBLOCK&O_NONBLOCK &#&define&FNDELAY&O_NDELAY &#endif&/*&Use&BSD.&*/&
现在一目了然了吧?打开串口时非阻塞模式的O_NDELAY或O_NONBLOCK选项
fcntl设置非阻塞模式的第3个参数FNDELAY或者FNONBLOCK 其实都是O_NONBLOCK主要就是为了兼容
原文链接:【编辑推荐】【责任编辑: TEL:(010)】
大家都在看猜你喜欢
头条头条头条头条原创
24H热文一周话题本月最赞
讲师:30797人学习过
讲师:133506人学习过
讲师:782758人学习过
精选博文论坛热帖下载排行
本书深入浅出地说明了如何利用.NET、Flash及XML来辅助Flash富媒体应用程序的开发。
本书首先介绍了Flash影片应用程序与.NET应用程序结合的...
订阅51CTO邮刊刚入手经济B。求各种教程.linUX大侠们速度! - 阿里云
查看完整版本: [--
刚入手经济B。求各种教程.linUX大侠们速度!
刚入手经济B。求各种教程.linUX .大侠们速度!&或者邮箱发给我 QQ都行
阿里云快速安装网站:&LAMP:&阿里云主机使用心得:
用wdlinux一键搭建linux服务器的网站环境&强烈推荐!!!!
我的论坛上就有图文教程,你可以去看下,很简单的一键搭建linux服务环境
我也推荐使用wdcp控制面板,菜鸟很好入门的。
引用 引用第4楼kideny于 13:59发表的&&:&我也推荐使用wdcp控制面板,菜鸟很好入门的。 && &什么来的 能说详细吗?
官方教程很详细
查看完整版本: [--
Powered by
Gzip disabled拒绝访问 | zhidao. | 百度云加速
请打开cookies.
此网站 (zhidao.) 的管理员禁止了您的访问。原因是您的访问包含了非浏览器特征(3a1a5e28e1114370-ua98).
重新安装浏览器,或使用别的浏览器安全检查中...
请打开浏览器的javascript,然后刷新浏览器
< 浏览器安全检查中...
还剩 5 秒&RMB求写一个linux进程守护,有空的大侠联系下,谢谢_linux吧_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:178,360贴子:
RMB求写一个linux进程守护,有空的大侠联系下,谢谢收藏
RMB求写一个linux进程守护,有空的大侠联系下,谢谢!因本人技术不到位。对linux 命令不是很懂,请人做一个进程守护,有意思的联系下qq:
linux运维就找万和,零首付,保障就业哦!linux运维就找万和,零首付,保障就业哦!重要的事情要说三遍!
登录百度帐号推荐应用}

我要回帖

更多关于 usb转232串口驱动下载 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信