我正在编写一个程序,它不断地向 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/

10-15 16:48