CAN数据包模式编程说明
1、 CAN-bus帧转换模式
设备CAN-bus端口支持<</span>流传输模式>和数据包>两种转换模式
l 数据包>采用特定的数据报文的形式,实现CAN-bus与以太网或串口之间的数据传输,此模式采用20字节定长数据报文传输数据,封装了所有的CAN-bus2.0A/B报文信息,并且采用帧对帧转换传输模式,符合CAN-bus工作特性,实时性极好。
l <</span>流传输模式>从以太网或串口接收到的任意格式的原始数据,将自动以8个字节为单位,自动打包成CAN-bus2.0B数据帧发送到CAN-bus,CANID由设备配置参数决定,如果不足8个字节,则按照实际数据长度填充CAN-bus帧。
从CAN-bus接收到的数据,只传输1-8字节的CAN-bus数据区数据到以太网或串口,不传输CANID等其他数据。此模式用于传输RS232/RS485通讯协议。
用户可以通过Telnet或RS232管理口,将CAN-bus端口设置为包传输>模式。管理口参数为:9600bps,8数据位,1停止位,无校验,无流控。可以使用超级终端直接打开并登录到设备进行管理。
2、 通讯接口
1) CAN-bus转以太网通讯方式
上位机软件通过Socket规范与设备直接建立TCP/IP连接,在成功建立TCP/IP连接后,上位机与设备就可以进行双向数据通讯。
设备支持TCP/IPServer、Client两种工作模式,默认工作在Server模式,设备监听TCP/IP6020-6023端口,等待连接。
使用Socket TCP/IP方式时,建议开启KeepAlive功能,并设置断线检测为10秒,这样就可以快速检测出线路的物理中断。
2) CAN-bus转串口通讯方式
CAN-bus转串口设备(或模式)直接使用设备的硬件串口实现CAN-bus与串口之间的数据交换。
在CAN-bus端口使用包传输模式>时,采用20字节定长数据报文传输数据,数据传输采用存储转发方式工作,设备收到一帧或几帧串口数据后,在达到指定超时而没有新数据到来时,将数据转发到CAN-bus。
用户可以一次发送一帧或几帧数据到串口,然后等待一个超时时间,设备就会将存储的数据转发到CAN-bus。此超时时间可以根据需要进行设置。
设备*多可存储50帧1000个字节的串口至CAN-bus报文数据。
3) 虚拟串口通讯方式
在使用CAN-bus转TCP/IP产品(或模式)时,可以使用VSPM虚拟串口软件,将设备CAN-bus端口对应的TCP/IP端口映射成本机的虚拟COM口,使用传统串口调试工具,就可以进行CAN-bus总线通讯调试。
也可以使用传统的串口编程方式进行应用开发,可以避免编写复杂的网络通讯代码。
其通讯方式与相同。
3、 通讯报文
1) 通过TCP/IP或串口发送数据到CAN-bus
发送报文:[00] [01000000] [08] [0001] [01][00] [00000000]
报文说明:
[00]:CAN端口索引,报文的第1个发送字节,发送时忽略。
[01 00 00 00]:发送的CANID,低位字节在前首先发送,此处为01。
[08]:此CAN数据包中的CAN数据区长度(*大8个字节),此处为8个字节。
[01 02 03 04 05 06 0708]:8个字节的CAN数据区数据,如果上面的数据长度不足8个字节,可以用任意数据填充剩余字节,确保整帧报文为20字节。
[01]:1为扩展帧(CAN2.0B)格式,0为标准帧(CAN2.0A),此处为扩展帧。
[00]:远程传输位,0-非RTR数据包,1-为RTR数据包,此处为非RTR包。
[00 00 0000]:保留的4个数据字节,报文*后发送字节,在CAN-bus转串口时后两个字节可以作为CRC16校验字节。此处未使用。
一次发送40字节,就可以连续发送2帧报文
[0001][A0A1A2A3A4A5A6A7]
2) 通过TCP/IP或串口接收CAN-bus数据
收到报文:[01] [01000000] [08] [0001] [01][00] [00000000]
报文说明:
[01]:从B口收到的数据,0-3对应A-D四个CAN-bus端口,为报文接收到的第1个字节,如果是单口CAN-bus转以太网设备,或CAN-bus转串口设备,一直为00。此处为01,说明从B口收到数据。
[01 00 00 00]:接收到的CANID(低位字节在前,高位在后)。此处为01。
[08]:此CAN数据包中的CAN数据区长度(*大8个字节),此处为8个字节。
[01 02 03 04 05 06 0708]:8个字节的CAN数据区数据。
[01]:1为扩展帧(CAN2.0B)格式,0为标准帧(CAN2.0A)。此处为扩展帧。
[00]:远程传输位,0-非RTR数据包,1-为RTR数据包。此处为非RTR包。
[00 00 0000]:保留的4个数据字节,报文*后发送字节,在CAN-bus转串口时,后两个字节可以作为CRC16校验字节。此处未使用。
4、 CAN-bus至串口数据帧传输
从串口接收CAN-bus数据时,应用软件收到数据后,如果在一个等待时间内没有数据,就可以认为收全数据,可以进行数据处理。这个等待时间由设备收到的CAN-bus数据帧间隔决定。
5、 CANID详解
CANID为4个字节的无符号长整型数据(32位),遵循无符号长整型数据类型内存布局,即低位字节在前,高位字节在后。CAN2.0A使用id的低11位,CAN2.0B使用id的低29位。
下表为CAN2.0B的CAN ID对应表,2.0A使用2个低位字节。
例如CAN ID=100000=0x0186A0,对应的发送顺序为:A0 86 0100
0xA0 | 0x86 | 0x01 | 0x00 |
CAN ID 0-7位 | CAN ID 8-15位 | CAN ID 16-23位 | CAN ID 24-28位 |
低位字节1 首先发送 | 低位字节2 | 高位字节1 | 高位字节2 *后发送 |
例如发送的id=0x01,产生的发送报文如下(16进制):
00 01000000 08 000101 00 00000000
例如发送的id=0x88,产生的发送报文如下(16进制):
00 88000000 08 000101 00 00000000
例如发送的id=0x186A0,产生的发送报文如下(16进制):
00 A0860100 08 0001 01 00 00000000
6、 通讯数据结构
typedef struct __attribute__ ((packed))_NETWORK_CANFRAME
{
unsigned char candevindex; //[1个字节长度],CAN端口,0-3对应*多四个CAN端口,接收效发送时忽略。
unsigned longid; // [4个字节长度],CAN包ID
unsigned charlen; //[1个字节长度],数据长度,1-8字节
unsigned char byte[8]; // [8个字节长度],CAN包数据
unsigned charext; //[1个字节长度],1-为扩展消息格式,0-标准消息格式
unsigned charrtr; //[1个字节长度],远程传输位
unsigned longparam1; //[4个字节长度],备用参数
}NETWORK_CANFRAME;
上述为C定义,单字节对齐,sizeof(NETWORK_CANFRAME)为20个字节。
TNetwork_CANFrame=packedrecord
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定义,单字节对齐,sizeof为20个字节。