通过插座访问CAN总线端口;需要非阻塞解决方案

时间:2017-03-22 20:47:40

标签: qt sockets qml can-bus

我有一个应用程序,我将使用独立的C编程来读取带有套接字的CAN总线端口。用户界面就是Qt / QML代码。我想使用非阻塞方法来调用bin程序,并且不返回任何内容或返回CAN数据包的字符串。

应用程序将是低速(仅监控按键等),因此速度不是问题。当前的方法涉及将数据从套接字程序写入文件,然后让另一个C程序获取文件并将字符串回送回QML。啊!看起来很乱。简单的Go / NoGo调用会更容易。这是我到目前为止所获得的代码。

感谢您提出任何意见。

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>

#include <net/if.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/ioctl.h>

#include <linux/can.h>
#include <linux/can/raw.h>

//  Returns 0 if no errors, > 0 if errors found
int main(void) {

    struct ifreq ifr;
    struct can_frame frame;
    struct sockaddr_can addr;

    int s;                          // CAN socket descriptor
    int nbytes;                     // Number of bytes read from CAN socket

    char run_daemon = 0;            // Set to 1 to run as a daemon process
    char show_errors = 0;           // Set to 1 to print errors
    char *ifname = "can0";          // Define the CAN driver for use

    if (run_daemon)                 // Skip the daemon call if not enabled
        daemon(1,1);

    if ((s = socket(PF_CAN, SOCK_RAW, CAN_RAW)) < 0) {
    if (show_errors)
        perror("Error while opening RAW socket");
    return 1;
    }

strcpy (ifr.ifr_name, ifname);
ioctl(s, SIOCGIFINDEX, &ifr);

addr.can_family  = AF_CAN;
addr.can_ifindex = ifr.ifr_ifindex;


if (bind(s, (struct sockaddr *)&addr, sizeof(addr)) < 0) {
    if (show_errors)
        perror("Error in socket bind");
    return 2;
    }

//  Loop here for daemon process
while (1) {

// Read CAN frame data
    nbytes = read(s, &frame, sizeof(struct can_frame));

// If data is ready, process it
    if (nbytes > 0) {

    // Print all relevent frame data to QML
       printf("%d ",frame.can_id);
       printf("%d ",frame.can_dlc);

       if(frame.can_dlc>0)  printf("%d ",frame.data[0]);
       if(frame.can_dlc>1)  printf("%d ",frame.data[1]);
       if(frame.can_dlc>2)  printf("%d ",frame.data[2]);
       if(frame.can_dlc>3)  printf("%d ",frame.data[3]);
       if(frame.can_dlc>4)  printf("%d ",frame.data[4]);
       if(frame.can_dlc>5)  printf("%d ",frame.data[5]);
       if(frame.can_dlc>6)  printf("%d ",frame.data[6]);
       if(frame.can_dlc>7)  printf("%d ",frame.data[7]);

       printf("\n");
       }

    if (!run_daemon) {      // Exit if daemon is not running
        close(s);           // Close the CAN socket
        return 0;
        }
    }
return 0;            // Should never get here !!!
}

0 个答案:

没有答案