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

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

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

读串口

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

read函数原型:

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

参数说明:

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

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

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

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

    printf("nread=%d,%s\n",nread,buff);


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

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

  1. while( 1) {
  2. 非阻塞read(设备 1);
  3. if(设备 1有数据到达)
  4. 处理数据;
  5. 非阻塞read(设备 2);
  6. if(设备 2有数据到达)
  7. 处理数据;
  8. ...
  9. sleep(n);
  10. }
sleep(n)的目的是为了做个延迟防止一直在循环做无用功,在延迟等待的时候可以调度其它进程。

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

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

  1. #include<unistd.h>
  2. #include<stdlib.h>
  3. int main(void){
  4. char buf[ 10];
  5. int n;
  6. n=read(STDIN_FILENO,buf, 10);
  7. if(n< 0){
  8. perror( "read STDIN_FILENO");
  9. exit( 1);
  10. }
  11. write(STDOUT_FILENO,buf,n);
  12. return 0;
  13. }
编译后执行如下图所示:

运行结果

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

写串口

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

  1. #include <unistd.h>
  2. ssize_t write( int fd, const void *buf, size_t count);
参数含义同read相同,需要注意的也同read相同.设置阻塞非阻塞也会同样的影响到write.

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

关闭串口

close函数,函数原型:

  1. #include<unistd.h>
  2. int close(int fd);
关闭串口就这一个知识点,没有其它的了。

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

  1. nread=read(fd,buff, 8); //读串口
  2. printf( "nread=%d,%s\n",nread,buff);
  1. nread=read(fd,buff, 8); //读串口
  2. printf( "nread=%d,%s\n",nread,buff);
  1. nread=read(fd,buff, 8); //读串口
  2. printf( "nread=%d,%s\n",nread,buff);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值