关于can编程
之前说请发一下can的手册和例程,回答我去下载区,可是下载区根本没有。现在我自己试了一下,但是还没有成功。
我用的内核是28的,编译的时候我就直接把can里面本来选做模块的那个直接include了。
进入系统后我就用了
ifconfig can0 up
然后它就说是normol mode了,之后我就用了一个网上查到的一个基本的socketcan的程序,如下#include <sys/types.h>
#include <sys/socket.h>
#include <sys/ioctl.h>
#include <net/if.h>
#include <linux/can.h>
#include <linux/can/raw.h>
#include <string.h>
#include <stdio.h>
/* At time of writing, these constants are not defined in the headers */
#ifndef PF_CAN
#define PF_CAN 29
#endif
#ifndef AF_CAN
#define AF_CAN PF_CAN
#endif
int main()
{
/* Create the socket */
int skt = socket( PF_CAN, SOCK_RAW, CAN_RAW );
/* Locate the interface you wish to use */
struct ifreq ifr;
strcpy(ifr.ifr_name, "can0");
ioctl(skt, SIOCGIFINDEX, &ifr); /* ifr.ifr_ifindex gets filled
* with that device's index */
/* Select that CAN interface, and bind the socket to it. */
struct sockaddr_can addr;
addr.can_family = AF_CAN;
addr.can_ifindex = ifr.ifr_ifindex;
bind( skt, (struct sockaddr*)&addr, sizeof(addr) );
/* Send a message to the CAN bus */
struct can_frame frame;
frame.can_id = 0x123;
strcpy( frame.data, "foo" );
frame.can_dlc = strlen( frame.data );
int bytes_sent = write( skt, &frame, sizeof(frame) );
printf("byte_sent:%d \n", bytes_sent);
/* Read a message back from the CAN bus */
int bytes_read = read( skt, &frame, sizeof(frame) );
printf("byte_read:%d \n", bytes_read);
return 0;
}程序发送的部分能跑过去,但是实际can口并不正常,我用示波器看了一下,运行之后就一直在不停地发送,即使程序停掉之后也不会停止。看了波特率大概在230k左右。我用我的usb-can转换口也没有接到,置于接收部分就停在那了。
希望客服能给我一个可以工作的完整的包括发送与接收的例程,还有能告诉我一下设置波特率的方法,我是要做一个项目,时间比较紧,对驱动之类的我也不懂,之所以选择你们的板子就是因为你们驱动什么的都有。我现在界面储存之类的都没有问题就差一个can通讯了,希望能赶快给我些帮助。
这是测试代码 回复 2# 飞凌-fatfish
十分感谢啊,这个程序确实可以发送和接收了,但是还有一些问题。
发送和接收一定数量之后就不能再用了。后来我又用socketcan的那套can-util下面的cansend试了一下,发送了一些之后就开始报no buffer space available的错误了。后来我上socket can上面看了一下,这个问题好像是有的,后来应该是有个补丁处理了这个问题。
飞凌的6.28里的那个驱动好像已经比较老了,6.36里的驱动比较新,但是用6.36的内核的话就没有can0这个设备了,是不是现在6.36的代码还没有提供对can的支持?
页:
[1]