marching118 发表于 2011-2-28 14:24:20

关于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通讯了,希望能赶快给我些帮助。

飞凌-fatfish 发表于 2011-2-28 16:46:30


这是测试代码

marching118 发表于 2011-3-1 14:20:31

回复 2# 飞凌-fatfish


    十分感谢啊,这个程序确实可以发送和接收了,但是还有一些问题。

发送和接收一定数量之后就不能再用了。后来我又用socketcan的那套can-util下面的cansend试了一下,发送了一些之后就开始报no buffer space available的错误了。后来我上socket can上面看了一下,这个问题好像是有的,后来应该是有个补丁处理了这个问题。

飞凌的6.28里的那个驱动好像已经比较老了,6.36里的驱动比较新,但是用6.36的内核的话就没有can0这个设备了,是不是现在6.36的代码还没有提供对can的支持?

追梦鸟 发表于 2012-12-26 10:21:54

pcibusgood 发表于 2012-12-26 11:14:11

页: [1]
查看完整版本: 关于can编程