Linux下串口通信详解(下)读写串口及关闭串口
2016-02-22 12:08
399 查看
上一篇博客是串口的打开及配置,博客链接http://blog.csdn.net/specialshoot/article/details/50707965
这一篇我将要把读写串口及串口关闭的操作详细介绍一下。
read函数原型:
参数说明:
fd:文件描述符
*buf:缓冲区,读取的数据会被放到这个缓冲区中去
count:请求读取的字节数,读上来的数据保存在缓冲区buf中,同时文件的当前读写位置向后移。
如下两句代码即可:
read默认为阻塞模式,若在open操作中设置O_NONBLOCK则是非阻塞模式。在阻塞模式中,read没有读到数据会阻塞住,直到收到数据;非阻塞模式read没有读到数据会返回-1不会阻塞。
如果是非阻塞模式,read要放在循环中保证持续读数据:
如果是阻塞模式,便可以直接调用read,不用放在while循环中。
阻塞模式有出现一个问题,见下面代码:
大家可以看到第一次输入hello没有问题,第二次输入helloworldhelloworld后helloworld这10个字符打印出来,程序退出后,Shell继续读取用户输入的命令,于是读走了终端设备输入缓冲区中剩下的字符和换行符当做一条命令去处理,运行不了显示未找到命令。
我上传的代码有阻塞模式的,也有非阻塞模式的,大家看open中有无设置O_NONBLOCK即可判断阻塞或是非阻塞模式。非阻塞模式read和write要放在while循环中。
代码资源链接:http://download.csdn.net/detail/specialshoot/9438578
这一篇我将要把读写串口及串口关闭的操作详细介绍一下。
读串口
读串口就是接收串口数据,通过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
相关文章推荐
- Linux socket 初步
- Linux Kernel 4.0 RC5 发布!
- linux lsof详解
- linux 文件权限
- Linux 执行数学运算
- 10 篇对初学者和专家都有用的 Linux 命令教程
- Linux 与 Windows 对UNICODE 的处理方式
- Ubuntu12.04下QQ完美走起啊!走起啊!有木有啊!
- 解決Linux下Android开发真机调试设备不被识别问题
- 运维入门
- 运维提升
- Linux 自检和 SystemTap
- Ubuntu Linux使用体验
- c语言实现hashmap(转载)
- Linux 信号signal处理机制
- linux下mysql添加用户
- Scientific Linux 5.5 图形安装教程
- Linux 下无损图片压缩小工具介绍