我正在编写一个程序,它不断地向 CAN 总线发送“Hello”并通过 SocketCAN 从总线读取数据。我希望这两个步骤是独立的。这意味着即使总线上没有数据,程序仍然会发送“Hello”。但是用通常的 CAN 读取是不可能的,因为这个函数会停止程序运行并等待数据。
有没有办法让它不阻塞或只等待数据几毫秒?
最佳答案
您可以使用以下星座(这不是完整的解决方案,而只是算法):
while(1) {
FD_ZERO(&rdfs);
FD_SET(s, &rdfs);
tv.tv_sec = 0;
tv.tv_usec = 10000; // microseconds
rc = select(s + 1, &rdfs, NULL, NULL, &tv);
// rc == 0 - timeout
if (!rc) {
// write your CAN frame
}
if (FD_ISSET(s, &rdfs)) {
// read CAN frames
}
}
有关更多信息以及如何处理返回值,请参阅 man select。
关于c - SocketCAN连续读写,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21135392/