我在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
如何避免这个问题(它不是一直发生的?)
答案 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的返回值。
下进行。