device /dev/ttyS2 is locked问题分析和解决

本文介绍了在使用minicom调试远程服务设备时遇到的串口连接锁死问题及解决过程。通过检查/var/lock/目录下的锁定文件并解决硬件连线问题,最终实现了设备的正常连接。

问题

开发了一款远程服务的设备,在调试过程中,出现了用户无法使用串口连接下端设备的问题,我们设备上使用的是minicom进行串口连接和调试的。
查看设备连接问题,提示 device /dev/ttyS2 is locked。

分析

ttyS2就是我们串口使用的端口设备,提示被锁定,可以在/var/lock/目录下查看是否有锁定文件。
/var/lock功能介绍:

许多程序遵循在/var/lock 中产生一个锁定文件的约定,以支持他们正在使用某个特定的设备或文件。其他程序注意到这个锁定文件,将不试图使用这个设备或文件。注意该目录不可以随便更改。

问题解决

/var/lock目录下有 LCK…ttyS2这样的一个文件,查看时间是问题发生时间创建的。直接删除。
重新使用minicom连接232尝试,没有报错了。

后记

lock问题到此就解决了,但是我们的设备上使用minicom发现不能输入命令(下联设备是一个交换机),卡在minicom的登录交互页面。
首先怀疑连线不通,因为我们使用的是网口作为串口输出口使用,使用网线测试仪查看网线,结果发现网线是一个交叉线,问题就是硬件连线不通。
由于我们卡在了minicom登录交互页面,智能强行退出,退出后发现又出现了lock问题,在此删除,使用直连线连接,启动minicom连接成功。
整个问题原因是由于232使用了交叉线,导致底层硬件连接不通,打开minicom导致无法输入命令卡住,用户只能强行断掉,属于不正常退出,系统认为用户仍然使用该硬件,产生了锁。后面就连接出现锁住的问题。

static int rs485_open() { int fd = 0; int status = 0; int baudrate_index = 0; fd = open("/dev/ttyS1", O_RDWR | O_NOCTTY| O_NDELAY); if(fd <= 0) { perror("open /dev/ttyS1 failed!"); return ERROR; }else { OSDP_ERROR("open /dev/ttyS1 success."); } if(ioctl(fd, TIOCEXCL) != 0) { OSDP_ERROR("set fd exclusive mode failed, err:%s", strerror(errno)); goto error; } if (flock(fd, LOCK_EX | LOCK_NB) != 0) { goto error; OSDP_ERROR("another process has locked the comport, error:%s", strerror(errno)); }else { OSDP_ERROR("get flock success."); } struct termios new_cfg; if(tcgetattr(fd, &rs485_orig_tio) != 0) { perror("tcgetattr"); close(fd); return ERROR; } if ( isatty(fd) == 0 ) perror("This is not a tty device "); OSDP_ERROR("open /dev/ttyS1 success."); baudrate_index = get_baudrate_index(); OSDP_ERROR("baudrate error: %d", baudrate_index); if (baudrate_index < 0) { baudrate_index = B115200; } //3.设置串口的通信模式 bzero(&new_cfg, sizeof(new_cfg)); new_cfg = rs485_orig_tio; cfmakeraw(&new_cfg); //4.配置串口信息 cfsetispeed(&new_cfg, baudrate_index); cfsetospeed(&new_cfg, baudrate_index); new_cfg.c_cflag |= CLOCAL | CREAD; //设置数据位:8位 new_cfg.c_cflag &= ~CSIZE; new_cfg.c_cflag |= CS8; //设置校验位 new_cfg.c_cflag &= ~PARENB; //设置停止位 new_cfg.c_cflag &= ~CSTOPB; //清空缓冲区 new_cfg.c_cc[VTIME] = 0; new_cfg.c_cc[VMIN] = 0; /*No hardware control*/ new_cfg.c_cflag &= ~CRTSCTS; new_cfg.c_iflag = IGNPAR; new_cfg.c_oflag = 0; new_cfg.c_lflag = 0; if((tcsetattr(fd, TCSANOW, &new_cfg)) != 0) { perror("tcsetattr"); goto error; } tcflush(fd, TCIFLUSH); if (ioctl(fd, TIOCMGET, &status) == -1) { tcsetattr(fd, TCSANOW, &rs485_orig_tio); perror("unable to get portstatus"); goto error; } status |= TIOCM_DTR; /* turn on DTR */ status |= TIOCM_RTS; /* turn on RTS */ if (ioctl(fd, TIOCMSET, &status) == -1) { tcsetattr(fd, TCSANOW, &rs485_orig_tio); perror("unable to set portstatus"); goto error; } fsync(fd); return fd; error: if(fd !=0 && fd != -1) { flock(fd, LOCK_UN); close(fd); } return ERROR; }
09-26
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值