串行端口卡在等待位置(4,

Serial port is stuck at wait(4,

本文关键字:位置 在等待 串行端口      更新时间:2023-10-16

我在C++for linux中有这个实现,用于初始化串行端口:

void setupSerialPort()
{
    fcntl(STDIN_FILENO, F_SETFL, O_NONBLOCK);       
    memset(&tio, 0, sizeof(tio));
    tio.c_iflag = 0;
    tio.c_oflag = 0;
    tio.c_cflag = CS8|CREAD|CLOCAL;                 
    tio.c_lflag = 0;
    tio.c_cc[VMIN] = 0;                             
    tio.c_cc[VTIME] = 0;                                
    fd = open(SERIALPORT, O_RDWR | O_NONBLOCK) ;                
    fcntl(fd , F_SETFL, 0);     // read data in the buffer per chunk
    cfsetospeed(&tio, B4800);             // 4800 baud
    cfsetispeed(&tio, B4800);             // 4800 baud
    tcsetattr(fd , TCSANOW, &tio);
}

有时,串行端口读数被卡住,我用strace来看看发生了什么。问题是:

strace -p 9454
Process 9454 attached - interrupt to quit
wait4(-1, ^C <unfinished ...>
Process 9454 detached

我该如何避免这个问题(它并非总是发生)?

随机出现的问题表明打开调用失败。因此,请检查open调用和其他剩余调用的返回值。

if (fd < 0) return;

同时确保串行端口干净关闭。

涉及IO的系统调用可能会因网络IO而陷入困境。由于您使用的是NON_BLOCKING模式,因此完整的代码在这里会有所帮助。就我个人而言,我以前也遇到过这种情况,我使用计时器生成SIG_USR,它用于以错误结束阻塞调用。该算法的伪代码如下:

 initiateTimer ( timeout)
     myfunctionCall(){
        someSysCall();
     }
  if(!signalled){
    disableTimer();
  }else{
     checkState();
     if(fatal)
       die;
   }

我的建议。。。用打开设备

int fd=TEMP_FAILURE_RETRY(打开(ttyName,O_RDWR|O_NOCTTY|O_NONBLOCK));

宏TEMP_FAILURE_RETRY用于保护打开、关闭、读取和选择不受信号中断的影响。如果您使用libc,请阅读有关该宏的信息。包含O_NOCTTY标志以避免设备成为进程的控制端口。检查有效fd的返回值。


C。