您的位置:控制工程论坛网论坛 » 现场总线 » CAN编程接口说明

常青树

常青树   |   当前状态:在线

总积分:1421  2024年可用积分:0

注册时间: 2008-09-28

最后登录时间: 2012-05-30

空间 发短消息加为好友

CAN编程接口说明

常青树  发表于 2008/12/20 9:01:11      847 查看 0 回复  [上一主题]  [下一主题]

手机阅读

1、与上位机通讯方式 
MixNet设备支持CAN数据包传输模式。此模式下MixNet设备使用特定的数据结构与上位机软件进行通讯。
MixNet设备使用了一个通用的数据结构来进行数据传输,只需要改动很少的代码,就可以将使用CAN通讯卡的上位机软件直接升级为以使用太网&TCP/IP通讯。
 
上位机可以通过2种方式与MixNet设备通讯:
1)   Socket TCP/IP通讯方式
上位机软件通过Socket规范与MixNet设备建立TCP/IP连接,在成功建立TCP/IP连接后,上位机与MixNet就可以进行双向数据通讯。
MixNet设备支持TCP/IP Server、Client两种工作模式,默认工作在Server模式,设备监听TCP/IP端口,等待连接。
 
2)   串口通讯方式
使用此方式必须要先使用VSPM虚拟串口软件将MixNet的CAN端口映射为虚拟COM口。
上位机软件可以直接使用传统的串口操作代码通过此虚拟串口与设备进行通讯。而不必编写复杂的网络处理代码。
 
 
2、数据结构及代码编写要点
1)   MixNet的NETWORK_CANFRAME通讯数据结构
typedef struct __attribute__ ((packed)) _NETWORK_CANFRAME
{
  u_char candevindex;  // CAN端口,0-3对应A-D四CAN端口,
// 上位机接收有效,发送忽略。
  u_long id;           // CAN包ID
  u_char len;          // 数据长度,1-8字节
  u_char byte[8];      // CAN包数据
  u_char ext;          // 1-为扩展消息格式,0-标准消息格式
  u_char rtr;          // 远程传输位
  u_long param1;       // 备用参数
} NETWORK_CANFRAME;
上述结构为GCC定义,sizeof(NETWORK_CANFRAME)为20个字节。
 
 
TNetwork_CANFrame=packed record
candevindex:byte;    // CAN端口,0-3对应A-D四CAN端口
// 上位机接收有效,发送忽略。
id:LongWord;         // CAN包ID
  len:byte;            // 数据长度,1-8字节
  candata:array[1..8] of Byte;   // CAN包数据
  ext:byte;            // 1-为扩展消息格式,0-标准消息格式
  rtr:byte;            // 远程传输位
  param1:LongWord;     // 备用参数
 end;                
上述结构为Delphi定义,Delphi中sizeof为20个字节。
 
MixNet以上述数据结构为数据帧与上位机进行数据通讯。
CAN总线参数(如速率等)可以通过MixNet本身的参数配置功能,透明的进行设置,无须编写任何代码。
 
 
2)   代码实例
(1)        接收代码:
//接收缓冲
NETWORK_CANFRAME recbuf;
//Socket接收,串口的接收操作与此类似,只不过调用的API不同
len=recv(sock, &recbuf, sizeof(recbuf), 0);
if(len!=sizeof(recbuf)) {
//接收错误
};
//recbuf中为接收到的CAN数据。
 
 
(2)        发送代码:
//发送缓冲
NETWORK_CANFRAME sendbuf;
// CAN端口,上位机发送时可以忽略此参数,要设置为0。
sendbuf.candevindex=0; 
sendbuf.id=0x123;  //CAN ID
sendbuf.len=8;     //CAN数据包长度
sendbuf.byte[0]=0; //8个CAN数据
sendbuf.byte[7]=7;
 sendbuf.ext=1;// ext=1使用CAN 2.0B格式,ext=0使用CAN 2.0A格式。
 sendbuf.rtr=0;// rtr=1为远程传输帧。
sendbuf.param1=0;//4字节备用参数,此参数仅用于未来扩展或二次开发。
 
//Socket发送,串口的接收操作与此类似,只不过调用的API不同
if(send(sock,&sendbuf,sizeof(sendbuf) ,0)==-1) {
//发送错误
}
1楼 0 0 回复