open函数
#include<fcntl.h>
int open(const char *pathname,int oflag,...);
参数解释:
pathname:文件路径名,串口在linux被看成文件
oflag:文件模式
- O_RDONLY只读模式
- O_WRONLY只写模式
- O_RDWR读写模式
上面三个参数在设置时必须选择一个,下面是可选的
- O_APPEND每次写操作都写入文件的末尾
- O_CREAT如果指定文件不存在,则创建这个文件
- O_EXCL如果要创建的文件已存在,则返回 -1,并且修改 errno 的值
- O_TRUNC如果文件存在,并且以只写/读写方式打开,则清空文件全部内容
- O_NOCTTY如果路径名指向终端设备,不要把这个设备用作控制终端。
- O_NONBLOCK如果路径名指向 FIFO/块文件/字符文件,则把文件的打开和后继 I/O设置为非阻塞模式(nonblocking mode)
下面三个变量同样是选用
- O_DSYNC等待物理 I/O 结束后再 write。在不影响读取新写入的数据的前提下,不等待文件属性更新。
- O_RSYNC读(read)等待所有写入同一区域的写操作完成后再进行
- O_SYNC等待物理 I/O 结束后再 write,包括更新文件属性的 I/O
对于串口的打开操作,必须使用O_NOCTTY参数,它表示打开的是一个终端设备,程序不会成为该端口的控制终端。如果不使用此标志,任务的一个输入(比如键盘终止信号等)都会影响进程。
阻塞的定义:
- 对于read,block指当串口输入缓冲区没有数据的时候,read函数将会阻塞在这里,一直到串口输入缓冲区中有数据可读取,read读到了需要的字节数之后,返回值为读到的字节数,然后整个程序才继续运行下去;(收)
- 对于write,block指当串口输出缓冲区满,或剩下的空间小于将要写入的字节数,则write将阻塞,一直到串口输出缓冲区中剩下的空间大于等于将要写入的字节数,执行写入操作,返回写入的字节数,然后整个程序才继续运行下去。(发)
非阻塞的定义:
- 对于read,no block指当串口输入缓冲区没有数据的时候,read函数立即返回,返回值为0。
- 对于write,no block指当串口输出缓冲区满,或剩下的空间小于将要写入的字节数,则write将进行写操作(不会等待在这里),写入当前串口输出缓冲区剩下空间允许的字节数,然后返回写入的字节数。
控制方法:
一是在打开串口的时候,open函数是否带O_NDELAY;
阻塞:fd = open(devname, O_RDWR | O_NOCTTY);
非阻塞:fd = open(devname, O_RDWR | O_NOCTTY | O_NDELAY);
二是可以在打开串口之后通过fcntl()函数进行控制
阻塞:fcntl(fd,F_SETFL,0)
非阻塞:fcntl(fd,F_SETFL,FNDELAY)







网友评论