首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SocketCAN连续读写

SocketCAN连续读写
EN

Stack Overflow用户
提问于 2014-01-15 10:50:27
回答 4查看 15.5K关注 0票数 3

我正在编写一个程序,它不断地向CAN总线发送"Hello“,并通过SocketCAN从总线读取数据。我希望这两步独立。这意味着即使总线上没有数据,程序仍然会发送"Hello“。但是通常可以读取它是不可能的,因为这个函数停止程序运行并等待数据。

有没有办法使它非阻塞或只等待几毫秒的数据?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2014-01-16 08:28:11

您可以使用以下星座(这不是完整的解决方案,而是算法):

代码语言:javascript
复制
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
    }
}

有关更多信息和如何处理返回值,请参见人选

票数 2
EN

Stack Overflow用户

发布于 2014-01-16 10:47:41

另一种我发现的方法-线。只要让可以阅读线程工作,它不会停止主循环。对于Linux系统,如下所示:

代码语言:javascript
复制
 #include <pthread.h>

    void *thread(int cansock) {
       struct can_frame rxmsg;      
       while (1) {   
            read(cansock, &rxmsg, sizeof(rxmsg));
            printf("message received\n");                     
        }
    }

    int main(){
// initialize CAN socket and message to send
    pthread_t pth;
    pthread_create(&pth, NULL, thread, cansock);
    while(1){
      write(cansock, &txmsg, sizeof(txmsg));
      printf("message sent\n");
      }
    return 0;
    }
票数 3
EN

Stack Overflow用户

发布于 2016-07-12 23:16:40

请注意此解决方案:

代码语言:javascript
复制
void *thread(int cansock) {
       struct can_frame rxmsg;      
       while (1) {   
            read(cansock, &rxmsg, sizeof(rxmsg));
            printf("message received\n");                     
        }
    }

因为如果read()开始返回一个没有块的错误,并且这是在字段中,并且没有人查看printf()的结果,那么您将进入一个繁忙的循环。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21135392

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档