0

我在 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

我怎样才能避免这个问题(它不会一直发生)?

4

3 回答 3

0

我的建议...打开设备:

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

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


C。

于 2013-03-04T05:10:07.687 回答
0

随机发生的问题表明对 open 的调用失败。因此,请检查 open call 和其他剩余调用的返回值。

if (fd < 0) return;

还要确保串行端口的干净关闭。

于 2013-02-27T13:44:56.663 回答
0

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

 initiateTimer ( timeout)
     myfunctionCall(){
        someSysCall();
     }
  if(!signalled){
    disableTimer();
  }else{
     checkState();
     if(fatal)
       die;
   }
于 2013-02-27T20:18:38.987 回答