首先附上can的接收程式:
/* 1. 報文發送程式 */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <net/if.h>
#include <sys/ioctl.h>
#include <sys/socket.h>
#include <linux/can.h>
#include <linux/can/raw.h>
int main()
{
int s, nbytes;
struct sockaddr_can addr;
struct ifreq ifr;
struct can_frame frame[2] = {{0}};
s = socket(PF_CAN, SOCK_RAW, CAN_RAW);//創建套接字
strcpy(ifr.ifr_name, "can0" );
ioctl(s, SIOCGIFINDEX, &ifr); //指定 can0 設備
addr.can_family = AF_CAN;
addr.can_ifindex = ifr.ifr_ifindex;
bind(s, (struct sockaddr *)&addr, sizeof(addr));//將套接字與 can0 系結
//禁用過濾規則,本行程不接收報文,只負責發送
setsockopt(s, SOL_CAN_RAW, CAN_RAW_FILTER, NULL, 0);
//生成兩個報文
frame[0].can_id = 0x11;
frame[0]. can_dlc = 1;
frame[0].data[0] = 'Y';
frame[0].can_id = 0x22;
frame[0]. can_dlc = 1;
frame[0].data[0] = 'N';
//回圈發送兩個報文
while(1)
{
nbytes = write(s, &frame[0], sizeof(frame[0])); //發送 frame[0]
if(nbytes != sizeof(frame[0]))
{
printf("Send Error frame[0]\n!");
break; //發送錯誤,退出
}
sleep(1);
nbytes = write(s, &frame[1], sizeof(frame[1])); //發送 frame[1]
if(nbytes != sizeof(frame[0]))
{
printf("Send Error frame[1]\n!");
break;
}
sleep(1);
}
close(s);
return 0;
}
在這個程式中原本設定發送的擴展幀ID是0x0cf11f05,我把這個交叉編譯放在IMX6Q開發板(跑的Linux系統)上運行,通過周立功的cantest軟體發送can報文,板子上接收的ID顯示為0x8cf11f05,顯示不正確,,另外我試了下,當發送的報文ID為0x1cf11f05時,接收顯示為0x9cf11f05,而擴展幀的ID有效范圍為0-0x1fffffff,初步分析是在ID的前面多了兩位10,有哪位大神知道原因啊?或者有更好的分析結果?謝謝各位了!
下圖是結果截圖:

發送報文截圖

板子上接收資訊截圖
uj5u.com熱心網友回復:

我試了一下,我的也是。。查了資料,,說是擴展幀第一個位元組的第7位是FF,在擴展幀中都是1,同樣的,在標準幀中都是0,不知道這么說OK嗎。
可以去搜一下CAN的擴展幀的幀資訊格式。
uj5u.com熱心網友回復:

bit31是擴展幀標志位CAN_EFF_FLAG,取擴展幀ID的時候記得用掩碼CAN_EFF_MASK與一下
uj5u.com熱心網友回復:
和博主遇到相同的問題,想討論下轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/110322.html
標籤:應用程序開發區
上一篇:如何在特定的位置替換字符
下一篇:本機網路設定沒vm8什么回事
