CAN バスでメッセージを読み書きする必要があるカスタム組み込み Linux システムに取り組んでいます。これを実現するためにSocketCANが使用されています。
CAN インターフェイス can0 は、ボーレートが 500 kbps に設定されたブート時に起動されます。CANoe、cangen、および candump を使用して、メッセージの送受信をテストしています。CANoe が組み込みシステムにメッセージを送信するように設定されている場合、candump は組み込みシステムでこれらのメッセージを問題なく読み取ることができます。cangen がメッセージを送信するように設定されている場合、CANoe は組み込みシステムからメッセージを問題なく読み取ることができます。
read() 関数を使用して can0 インターフェイスからメッセージを読み取る小さなプログラムを作成しました。単一の CAN メッセージを読み取るために read() 関数が呼び出されると、関数はブロックされ、決して戻りません。ifconfig によって報告された受信バイト数が期待どおりに増加しているため、CAN インターフェースがデータを受信していることは確かです。プログラムと同時に candump を実行すると、インターフェイスがバスから CAN メッセージを受信していることも示されます。以下は、CAN インターフェイスを開いて読み取るための関連コードです。エラーチェックは省略されています。
ソケットを開く:
int socketNum = 0;
char interface[10] = "can0";
struct sockaddr_can addr;
struct ifreq ifr;
memset(&addr, 0, sizeof(addr));
memset(&ifr, 0, sizeof(ifr));
socketNum = socket(PF_CAN, SOCK_RAW, CAN_RAW);
addr.can_family = AF_CAN;
strncpy(ifr.ifr_name, interface, sizeof(interface));
ioctl(socketNum, SIOCGIFINDEX, &ifr);
addr.can_ifindex = ifr.ifr_ifindex;
bind(socketNum, (struct sockaddr *)&addr, sizeof(addr));
ソケットの読み取り:
struct can_frame frame;
int nbytes = 0;
memset(&frame, 0, sizeof(frame));
/* Never returns despite interface receiving messages */
nbytes = read(socketNum, &frame, sizeof(frame));
コードに何かが欠けているか、何か間違っていますか? 他の誰かがこの問題に遭遇し、解決策を見つけましたか?