串行端口卡在等待位置(4,
Serial port is stuck at wait(4,
我在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。
相关文章:
- 在等待时破坏condition_variable
- 工作线程一直在等待,condition_variable甚至调用了notify_all
- 当光标位置在编辑控件 MFC 中更改时是否有通知代码?
- 为什么condition_variable在等待生产者-消费者的锁定?C++
- 仅在等待 20 秒后更新数据库记录,以便可以接收最大记录
- Java本机接口-C 不在等待Java功能完成
- 如果其他人在等待,是否有标准的STL或QT方法可以产生互惠码,否则请保留它
- 如何使用行位置在std :: ifstream中导航
- QSslSocket 在等待数据时超时(但 QTcpSocket 不会)
- 我如何在源代码中找到仍在等待的被破坏线程
- 访问违规写作位置在OpenCV中
- 如何停止C 程序在等待条件时关闭时崩溃
- QToolButton 的位置在调整大小或移动父小部件时不会改变
- 如果condition_variable::wait_for-delay参数在等待过程中发生更改,该怎么办
- 如何在等待时取消"提升::ASIO::读取"操作
- 我创建的c++istream对象和cin之间的区别在哪里,它在库中的可见位置在哪里
- 通过指定第 n 个节点位置在单链接列表中插入数据
- BlockingQueue 的 QWaitCondition:在线程仍在等待时销毁
- MySQL Windows c api 命名管道错误:"在'等待初始通信数据包'时丢失与 MySQL 服务器的连接,系统错误:0
- 串行端口卡在等待位置(4,