Linux下串口通信详解(下)读写串口及关闭串口

https://blog.csdn.net/specialshoot/article/details/50709257

上一篇博客是串口的打开及配置,博客链接http://blog.csdn.net/specialshoot/article/details/50707965

这一篇我将要把读写串口及串口关闭的操作详细介绍一下。

读串口

读串口就是接收串口数据,通过read来实现。

read函数原型:

#include <unistd.h>    
ssize_t read(int fd, void *buf, size_t count);  

参数说明:

  • fd:文件描述符
  • *buf:缓冲区,读取的数据会被放到这个缓冲区中去
  • count:请求读取的字节数,读上来的数据保存在缓冲区buf中,同时文件的当前读写位置向后移。

如下两句代码即可:

nread=read(fd,buff,8);//读串口 
printf("nread=%d,%s\n",nread,buff); 

注意:
read默认为阻塞模式,若在open操作中设置O_NONBLOCK则是非阻塞模式。在阻塞模式中,read没有读到数据会阻塞住,直到收到数据;非阻塞模式read没有读到数据会返回-1不会阻塞。

如果是非阻塞模式,read要放在循环中保证持续读数据:

while(1) {
非阻塞read(设备1);
if(设备1有数据到达)
  处理数据;
非阻塞read(设备2);
if(设备2有数据到达)
  处理数据;
...
sleep(n);
}

sleep(n)的目的是为了做个延迟防止一直在循环做无用功,在延迟等待的时候可以调度其它进程。

如果是阻塞模式,便可以直接调用read,不用放在while循环中。

阻塞模式有出现一个问题,见下面代码:

#include<unistd.h>
#include<stdlib.h>
int main(void){
    char buf[10];
    int n;
    n=read(STDIN_FILENO,buf,10);
    if(n<0){
        perror("read STDIN_FILENO");
        exit(1);
    }
    write(STDOUT_FILENO,buf,n);
    return 0;
}

编译后执行如下图所示:

运行结果

大家可以看到第一次输入hello没有问题,第二次输入helloworldhelloworld后helloworld这10个字符打印出来,程序退出后,Shell继续读取用户输入的命令,于是读走了终端设备输入缓冲区中剩下的字符和换行符当做一条命令去处理,运行不了显示未找到命令。

写串口

写串口即发送数据,用write函数,write函数原型如下:

#include <unistd.h>
ssize_t write(int fd, const void *buf, size_t count);

参数含义同read相同,需要注意的也同read相同.设置阻塞非阻塞也会同样的影响到write.

我上传的代码有阻塞模式的,也有非阻塞模式的,大家看open中有无设置O_NONBLOCK即可判断阻塞或是非阻塞模式。非阻塞模式read和write要放在while循环中

关闭串口

close函数,函数原型:

#include<unistd.h>  
int close(int fd);

关闭串口就这一个知识点,没有其它的了。

代码资源链接:http://download.csdn.net/detail/specialshoot/9438578

猜你喜欢

转载自blog.csdn.net/xiaodingqq/article/details/81216207