加入收藏 | 设为首页 | 会员中心 | 我要投稿 济源站长网 (https://www.0391zz.cn/)- 数据工具、数据仓库、行业智能、CDN、运营!
当前位置: 首页 > 服务器 > 搭建环境 > Linux > 正文

linux – QSerialPort在进程结束后对`/ dev / ttyS *`产生影响?

发布时间:2020-12-31 16:22:47 所属栏目:Linux 来源:网络整理
导读:当使用QSerialPort的Qt应用程序遇到非干净关闭时(例如由于接收而不处理SIGINT),串口的文件描述符如何受到影响? 运行在/ dev / ttyS0上打开QSerialPort的应用程序,然后退出Ctl-C,我发现那只猫 / dev / ttyS0立即返回(不打印任何内容)而不是等待数据(通常如此
副标题[/!--empirenews.page--]

当使用QSerialPort的Qt应用程序遇到非干净关闭时(例如由于接收而不处理SIGINT),串口的文件描述符如何受到影响?

运行在/ dev / ttyS0上打开QSerialPort的应用程序,然后退出Ctl-C,我发现那只猫< / dev / ttyS0立即返回(不打印任何内容)而不是等待数据(通常如此). 我希望如果这是由于一个打开的文件句柄左转,它会出现在lsof的输出中,但是lsof | grep ttyS0什么都不返回. (我不确定如何在特定文件描述符上搜索句柄.) 我意识到这是一个XY问题,因为我可以通过重写我的应用程序来正确处理SIGINT来完全避免这个问题,但是我想更深入地了解这里发生了什么以及是否有办法恢复处于此状态的串口. 编辑:根据要求,这是strace cat / dev / ttyS0的输出:

execve("/bin/cat",["cat","/dev/ttyS0"],[/* 17 vars */]) = 0
brk(0)                                  = 0x91ce000
access("/etc/ld.so.nohwcap",F_OK)      = -1 ENOENT (No such file or directory)
mmap2(NULL,8192,PROT_READ|PROT_WRITE,MAP_PRIVATE|MAP_ANONYMOUS,-1,0) = 0xb76fb000
access("/etc/ld.so.preload",R_OK)      = -1 ENOENT (No such file or directory)
open("/etc/ld.so.cache",O_RDONLY)      = 3
fstat64(3,{st_mode=S_IFREG|0644,st_size=72063,...}) = 0
mmap2(NULL,72063,PROT_READ,MAP_PRIVATE,3,0) = 0xb76e9000
close(3)                                = 0
access("/etc/ld.so.nohwcap",F_OK)      = -1 ENOENT (No such file or directory)
open("/lib/i386-linux-gnu/i686/cmov/libc.so.6",O_RDONLY) = 3
read(3,"177ELF111331240o1004"...,512) = 512
fstat64(3,{st_mode=S_IFREG|0755,st_size=1446056,1460600,PROT_READ|PROT_EXEC,MAP_PRIVATE|MAP_DENYWRITE,0) = 0xb7584000
mmap2(0xb76e3000,12288,MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE,0x15e) = 0xb76e3000
mmap2(0xb76e6000,10616,MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS,0) = 0xb76e6000
close(3)                                = 0
mmap2(NULL,4096,0) = 0xb7583000
set_thread_area({entry_number:-1 -> 6,base_addr:0xb75838d0,limit:1048575,seg_32bit:1,contents:0,read_exec_only:0,limit_in_pages:1,seg_not_present:0,useable:1}) = 0
mprotect(0xb76e3000,PROT_READ)   = 0
mprotect(0x8054000,PROT_READ)    = 0
mprotect(0xb771a000,PROT_READ)   = 0
munmap(0xb76e9000,72063)               = 0
brk(0)                                  = 0x91ce000
brk(0x91ef000)                          = 0x91ef000
open("/usr/lib/locale/locale-archive",O_RDONLY|O_LARGEFILE) = 3
fstat64(3,st_size=1534672,1534672,0) = 0xb740c000
close(3)                                = 0
fstat64(1,{st_mode=S_IFCHR|0620,st_rdev=makedev(136,3),...}) = 0
open("/dev/ttyS0",{st_mode=S_IFCHR|S_ISVTX|0660,st_rdev=makedev(4,64),...}) = 0
fadvise64_64(3,POSIX_FADV_SEQUENTIAL) = 0
read(3,"",32768)                      = 0
close(3)                                = 0
close(1)                                = 0
close(2)                                = 0
exit_group(0)                           = ?

这是stty -a -F / dev / ttyS0的输出:

speed 57600 baud; rows 0; columns 0; line = 0;
intr = ^C; quit = ^; erase = ^?; kill = ^U; eof = ^D; eol = <undef>; eol2 = <undef>; swtch = <undef>; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R;
werase = ^W; lnext = ^V; flush = ^O; min = 0; time = 0;
-parenb -parodd cs8 hupcl -cstopb cread clocal -crtscts
-ignbrk -brkint ignpar -parmrk -inpck -istrip -inlcr -igncr -icrnl -ixon -ixoff -iuclc -ixany -imaxbel -iutf8
-opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0
-isig -icanon -iexten -echo echoe echok -echonl -noflsh -xcase -tostop -echoprt echoctl echoke

解决方法

在POSIX下,终端设备(即串行端口和伪终端)具有 a whole bunch of settings,使计算机能够说出现有或已存在的基本 RS-232协议的多种变体.在恐龙和 teletypewriters(因此“tty”)统治地球的时代,大量的这个API被设计出来了,我们不会以同样的方式再次做到这一点,但我们现在仍然坚持下去.

终端设置是持久的;一旦一个程序设置它们,它们就会保持这种状态直到另一个程序改变它们命令行实用程序stty可以打印或更改这些设置; stty sane将它们全部重置为“合理”的默认值; stty -a将它们全部打印出来.

以下是我的计算机上stty sane适用的所有终端设置,以及QSerialPort对您的串行端口所做的操作. (那些只是一个神秘的标签,可能在前面有一个破折号,是布尔标志;领先的破折号意味着“关闭”,没有领先的破折号意味着“打开”.)

QSerialPort        stty sane    
----------------  ----------------
speed 57600 baud  speed 38400 baud
min = 0           min = 1         
clocal            -clocal         
-brkint           brkint          
ignpar            -ignpar         
-icrnl            icrnl           
-ixon             ixon            
-imaxbel          imaxbel         
-opost            opost           
-isig             isig            
-icanon           icanon          
-iexten           iexten          
-echo             echo

许多QSerialPort设置都是异常的,因为在这种状态下连接到串行端口的面向行或文件的程序会出现异常. (但是,它们非常适合于一个知道它正在与串口通信的程序,并且准备好处理转动这些特定旋钮的后果;可能是QSerialPort的作者知道他们在做什么.)那个是导致cat立即退出的是min = 0,它(与默认时间= 0一起)意味着“如果没有输入未决,则read()应返回零字节.”在正常情况下,read()返回的零字节意味着文件结束,因此cat会立即退出,因为它认为它已被传递给空文件. (这种模式很可能是在O_NONBLOCK之前发明的.)

(编辑:济源站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读