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個字節。