适用范围:
一个设备资源
两个使用者
使用方法:
get_Lock_U1_485( lock_id); //传入使用者ID进行拿锁
un_Lock_U1_485(); //调用即可解锁
.H 文件
#define LOCK_U1 0
#define UNLOCK_U1 1
//id盒子,把需要使用的ID放进去
typedef enum e_lock{
NO_USER = 0, //没有使用者,空闲状态
SET_LOCK = 0x22U, //使用者1
RUN_LOCK = 0x44U //使用者2
}e_lock_type;
//由此对485使用权进行管理
typedef struct manager{
//当前485状态
uint8_t use_state; //LOCK 和 UNLOCK状态
//当前使用者ID
e_lock_type lock_id;
//是否存在等待使用者
e_lock_type waite_id;
}s_lock_manager;
定义一个全局变量
s_lock_manager lock_manager;
.C 文件
/**
@bref 485半双工总线管理器,使用权分配与拿锁
user1在使用时,user2请求使用会被标记
等到user1使用后即可轮到user2使用
**/
uint8_t get_Lock_U1_485(e_lock_type lock_id){
//printf("%d请求拿锁\n",lock_id);
//当一个在使用时新增等待id,必须等到等待id使用并清空等待id才可以使用
if((lock_manager.use_state == LOCK_U1)&&(lock_manager.lock_id != lock_id)){ //如果正在被使用,并且新来的id不等于当前
lock_manager.waite_id = lock_id; //新增等待id
//printf("新增等待id:%d\n",lock_id);
return 0;
}
if((lock_manager.use_state == UNLOCK_U1)&&(lock_manager.waite_id != lock_id)&&((lock_manager.waite_id != NO_USER))){
printf("抢占拿锁退出\n");
return 0; //等待者还未使用,不能多次使用,防止多次占用
}
else if((lock_manager.use_state == UNLOCK_U1)&&(lock_manager.waite_id == lock_id)){
//printf("等待id拿锁\n"); /之前排队等待的ID拿到锁
lock_manager.waite_id = NO_USER; //等待位空出恢复
}
if( (lock_manager.use_state == UNLOCK_U1)||(lock_manager.waite_id == NO_USER)){
lock_manager.lock_id = lock_id;
//printf("此%d:已拿锁\n",lock_manager.lock_id);
if(lock_manager.use_state == UNLOCK_U1){
lock_Time = Start_cunter_0; //拿锁开始计时,不能超过3S
}
lock_manager.use_state = LOCK_U1; //拿锁,占用485的使用权
return 1;
}
else{
if(lock_Time >= 3000){ //拿锁最长时间3s ,防止被一直抢占
lock_manager.use_state = UNLOCK_U1; //解锁,解除485占用
lock_manager.lock_id = NO_USER;
lock_manager.waite_id = NO_USER;
printf("拿锁超时\n");
}
printf("拿锁失败:%d\n",lock_manager.lock_id);
return 0;
}
}
/**
* @ bref 解除占用
**/
uint8_t un_Lock_U1_485(void){
if(lock_manager.use_state == LOCK_U1){
lock_manager.use_state = UNLOCK_U1; //解锁,解除485占用
lock_manager.lock_id = NO_USER;
//printf("还锁\n");
return 1;
}else{
//printf("还锁\n");
return 1;
}
}