linux 下串口独占方式打开
参考文章: http://blog.csdn.net/rl529014/article/details/51336161
http://blog.csdn.net/lin_fs/article/details/7804494
http://blog.csdn.net/querdaizhi/article/details/7478169
以flock函数打开设备文件打开,是独占整个文件
int fd;
char com_name[]={};
sprintf(com_name,"/dev/ttyS100%d",com_port);
// sprintf(com_name,"/dev/ttyS%d",1);
// printf("before first open\n");
fd = open(com_name, O_RDWR|O_NOCTTY|O_NDELAY);
// fd = open(com_name, O_RDWR|O_EXCL,0444);
if (fd < )
{
perror("open serial port");
return(-);
} if(flock(fd,LOCK_EX|LOCK_NB)==)
{
printf("the file was not locked.\n");
}
else
{
printf("the file was locked.\n");
close(fd);
return -;
} if (fcntl(fd, F_SETFL, ) < )
{
perror("fcntl F_SETFL\n");
} if (isatty(STDIN_FILENO) == )
{
perror("standard input is not a terminal device");
} return fd;
以fcntl方式打开设备文件:
int fd;
char com_name[]={};
sprintf(com_name,"/dev/ttyS100%d",com_port);
// sprintf(com_name,"/dev/ttyS%d",1);
// printf("before first open\n");
fd = open(com_name, O_RDWR|O_NOCTTY|O_NDELAY);
// fd = open(com_name, O_RDWR|O_EXCL,0444);
if (fd < )
{
perror("open serial port");
return(-);
}
// printf("first open\n");
struct flock lock;
lock.l_type=F_WRLCK;
lock.l_pid=getpid();
lock.l_whence=SEEK_SET;
lock.l_start=;
lock.l_len=;
fcntl(fd,F_GETLK,&lock);
if(lock.l_type != F_UNLCK){
// printf("%d\n", lock.l_type);
return -;
}
lock.l_type=F_WRLCK;
lock.l_pid=getpid();
lock.l_whence=SEEK_SET;
lock.l_start=;
lock.l_len=;
if(fcntl(fd, F_SETLKW,&lock) < ){
perror("fcntl F_SETLKW\n");
}
if (isatty(STDIN_FILENO) == )
{
perror("standard input is not a terminal device");
}
return fd;
F_SETLKW 与 F_SETFL的区别是如果有其他锁阻止该锁被建立,则调用进程进入睡眠状态,等待该锁释放。一旦这个调用开始了等待,就只有在能够进行加锁或者收到信号时才会返回。
而且F_SETFL设置方式为fcntl(STDOUT_FILENO,F_SETFL,flags),而非fcntl(fd, F_SETLKW,&lock),无法建立锁机制。 F_SETFL 与 F_SETLKW 使用差别比较大
linux 下串口独占方式打开的更多相关文章
- Linux下串口编程入门
简介: Linux操作系统从一开始就对串行口提供了很好的支持,本文就Linux下的串行口通讯编程进行简单的介绍. 串口简介 串行口是计算机一种常用的接口,具有连接线少,通讯简单,得到广泛的使用.常用 ...
- Linux下串口編程遇到的接收数据错误及原因(0x0d,0x11接收错误)
摘要:Linux下串口编程遇到的接收数据错误及原因 来源:https://dotblogs.com.tw/k/2012/07/24/73572 近日在调试串口的时候发现,另一设备向我ARM板的串口发送 ...
- 在Linux下的中断方式读取按键驱动程序
// 在Linux下的中断方式读取按键驱动程序 //包含外部中断 休眠 加入poll机制 // 采用异步通知的方式 // 驱动程序发 ---> app接收 (通过kill_fasync()发送) ...
- Linux下查看某个进程打开的文件数-losf工具常用参数介绍
Linux下查看某个进程打开的文件数-losf工具常用参数介绍 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 在linux操作系统中,一切皆文件.通过文件不仅仅可以访问常规数据,还 ...
- "无法启动应用程序,工作组信息文件丢失,或是已被其他用户已独占方式打开"解决办法
当程序用ado的jet4.0方式连接mdb数据库的时候,对于设有access数据库密码的mdb的访问居然报错“无法启动应用程序,工作组信息文件丢失,或是已被其他用户已独占方式打开”. ADOConne ...
- linux下串口通信与管理
linux下的串口与windows有一些区别,下面将介绍一下linux下串口通信管理 查看是否支持USB串口: #lsmod | grep usbserial 如果没有信息:sudo apt-get ...
- Access无法启动应用程序,工作组信息文件丢失,或是已被其他用户已独占方式打开
使用SQL Server导入有密码的Access数据库内容,连接时出现错误提示: Access无法启动应用程序,工作组信息文件丢失,或是已被其他用户已独占方式打开 参考百度信息,可以点上图中的高级,在 ...
- Django项目部署在Linux下以进程方式启动
Django项目部署在Linux下以进程方式启动 这是一篇关于如何在linux下,以后台进程的方式运行服务,命令改改基本上就通用了. 开发完Django项目后,需要把项目部署到linux环境下.当然, ...
- Microsoft Jet 数据库引擎打不开文件,它已经被别的用户以独占方式打开,或没有查看数据的权限。
System.Data.OleDb.OleDbException (0x80004005): Microsoft Jet 数据库引擎打不开文件'D:\wwwroot\gonghouxie\wwwroo ...
随机推荐
- android存储方式的应用场景
作为一个完整的应用程序,数据存储操作是必不可少的.因此,Android系统一共提供了四种数据存储方式.分别是:SharePreference.文件存储.SQLite. Content Provider ...
- 011商城项目:图片服务器的安装---nginx
这个是电商的项目,不是传统项目,所以给图片单独架一台服务器. 我们看上图: 用户上传图片时上传到Tomcat1或者Tomcat2.然后Tomcat1和Tomcat2通过FTP服务把图片上传到图片服务器 ...
- [LeetCode] Roman to Integer 罗马数字转化成整数
Given a roman numeral, convert it to an integer. Input is guaranteed to be within the range from 1 t ...
- NoSql系列目录
mongodb系列学习 Mongodb学习笔记一(Mongodb环境配置) Mongodb学习笔记二(Mongodb基本命令) Mongodb学习笔记三(Mongodb索引操作及性能测试) Mongo ...
- 《如何正确学习JavaScript》读后小结
在segmentfault上读的一篇学习JavaScript路线的文章,做个小结. 一.简介.数据类型.表达式和操作符 (1)<JavaScript权威指南>前言1-2章&< ...
- 【WPF】WPF 布局
1.window 类继承自 ContentControl 所以内部只能有一个元素2.遵循原则: 不应显示的设置元素(控件)尺寸,可以通过设置最大最小尺寸来限制大小 ...
- 《UNIX环境高级编程》笔记——2.标准和实现
随着UNIX各种衍生版本不断发展壮大,标准化工作就十分必要.其实干啥事都是这样,玩的人多了,必须进行标准化. 一.UNIX标准 1.1 ISO C(ANSI C) ANSI:Amerocan Nato ...
- Newtonsoft.Json 序列化和反序列化 时间格式【转】
1.JSON序列化 string JsonStr= JsonConvert.SerializeObject(Entity); eg: A a=new A(); a.Name="Elain ...
- 精灵方向移动问题[math.floor]
local xd = math.cos(math.rad(self._direction));--self._direction方向角度 local yd = math.sin(math.rad(se ...
- Linux系统编程:基本I/O系统调用
文件描述符 进程每打开一个文件的时候,会获得该文件的文件描述符,而后续的读写操作都把文件描述符作为参数.在用户空间或者内核空间,都是通过文件描述符来唯一地索引一个打开的文件.文件描述符使用int类型表 ...