首先附上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,有哪位大神知道原因啊?或者有更好的分析结果?谢谢各位了!
下图是结果截图:发送报文截图板子上接收信息截图
/* 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,有哪位大神知道原因啊?或者有更好的分析结果?谢谢各位了!
下图是结果截图:发送报文截图板子上接收信息截图
我试了一下,我的也是。。查了资料,,说是扩展帧第一个字节的第7位是FF,在扩展帧中都是1,同样的,在标准帧中都是0,不知道这么说OK吗。
可以去搜一下CAN的扩展帧的帧信息格式。
bit31是扩展帧标志位CAN_EFF_FLAG,取扩展帧ID的时候记得用掩码CAN_EFF_MASK与一下