首页 / LINUX / Linux串口编程(组合帖)
Linux串口编程(组合帖)
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Linux串口编程(组合帖),小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2691字,纯文字阅读大概需要4分钟。
内容图文
一、打开串口
因为串口和其他设备一样,在类Unix系统中都是以设备文件的形式存在的,所以,理所当然得你可以使用open(2)系统调用/函数来访问它。但Linux系统中却有一个稍微不方便的地方,那就是普通用户一般不能直接访问设备文件。你可以选择以下方式做一些调整,以便你编写的程序可以访问串口。
1)改变设备文件的访问权限设置;
2)以root超级用户的身份运行程序;
3)将你的程序编写位setuid程序,以串口设备所有者的身份运行程序;
打开文件的选项
打开串口连接的时候,程序在open函数中除了Read+Write模式以外还指定了两个选项;
fd = open("/dev/ttyS0", O_RDWR | O_NOCTTY | O_NDELAY);
标志O_NOCTTY可以告诉UNIX这个程序不会成为这个端口上的“控制终端”。如果不这样做的话,所有的输入,比如键盘上过来的Ctrl+C中止信号等等,会影响到你的进程。
O_NDELAY标志则是告诉UNIX,这个程序并不关心端口另一端是否已经连接。如果不指定这个标志的话,除非DCD信号线上有space电压否则这个程序会一直睡眠。
二、串口输入
经典输入
经典输入是以面向行设计的。在经典输入模式中输入字符会被放入一个缓冲之中,这样可以以与用户交互的方式编辑缓冲的内容,直到收到CR(carriage return)或者LF(line feed)字符。选择使用经典输入模式的时候,你通常需要选择ICANON,ECHO和ECHOE选项:
options.c_lflag |= (ICANON | ECHO | ECHOE);
原始输入
原始输入根本不会被处理。输入字符只是被原封不动的接收。一般情况中,如果要使用原始输入模式,程序中需要去掉ICANON,ECHO,ECHOE和ISIG选项:
options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);
三、串口输出
加工过的输出
通过在c_oflag成员变量中设置OPOST选项的方法程序可以选择加工过的输出。
options.c_oflag |= OPOST;
在所有选项当中,你可能只需要使用ONLCR选项来将行分隔符映射到CR-LF组合对上。其他选项主要是历史遗留,仅仅与行打印机和终端跟不上串行数据的年代有关。
原始输出
原始输出方式可以通过在c_oflag中重置OPOST选项来选择:
options.c_oflag &= ~OPOST;
如果OPOST选项被设置成无效的话,其他c_oflag中的选项都会失效。
四、串口读取超时设置
有三种方式实现串口超时:
1、默认的阻塞模式(不实用);
2、采用select或epoll机制的非阻塞模式(写代码比较麻烦);
3、串口自带超时机制;
UNIX串口驱动提供了设置字符和包超时的能力。数组c_cc中有两个元素可以用来设置超时:VMIN和VTIME。
在经典输入模式或者通过open(2)和fcntl(2)函数传递NDELAY选项时,超时设置会被忽略。
注意要使这两个字段生效,必须使串口工作于非标准模式。
VTIME和VMIN需配合使用,它们的组合关系如下:
1、VTIME=0,VMIN=0:此时即使读取不到任何数据,函数read也会返回,返回值是0。
2、VTIME=0,VMIN>0:read调用一直阻塞,直到读到VMIN个字符后立即返回。
3、VTIME>0,VMIN=0:read调用读到数据则立即返回,否则将为每个字符最多等待 VTIME*100ms 时间。
4、VTIME>0,VMIN>0:read调用将保持阻塞直到读取到第一个字符,读到了第一个字符之后开始计时,此后若时间到了 VTIME*100ms 或者时间未到但已读够了VMIN个字符则会返回。
若在时间未到之前又读到了一个字符(但此时读到的总数仍不够VMIN)则计时重新开始(即每个字符都有VTIME*100ms的超时时间)。
内容总结
以上是互联网集市为您收集整理的Linux串口编程(组合帖)全部内容,希望文章能够帮你解决Linux串口编程(组合帖)所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。