串口卡在等待(4,

时间:2013-02-22 15:43:01

标签: c++ linux serial-port

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

如何避免这个问题(它不是一直发生的?)

3 个答案:

答案 0 :(得分:0)

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

if (fd < 0) return;

同时确保完全关闭串口。

答案 1 :(得分:0)

涉及IO的Syscalls可能会被网络IO专门卡住。由于您使用的NON_BLOCKING模式不是这种情况,完整的代码在这里会有所帮助。我个人之前遇到过这种情况,我使用timer生成SIG_USR,用于结束阻塞调用并发生错误。该算法的伪代码如下:

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

答案 2 :(得分:0)

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

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

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


下进行。