在现代汽车控制技术中,一般会采用CAN总线对车内的多个电子控制元件(ECU)进行控制,调节汽车行驶中各种参数(温度、速度等),一般通过CANTool装置实现CAN数据的显示及控制。为了方便用户使用,现在要针对CANTool开发对应的CANToolApp(Windows版,移动平台版),使用户能够更加直观了解CAN总线传递到CANTool上的各种实时数据及其实际物理含义,并且方便用户对各种实际物理值进行实时的更改。
上图为整个系统中的数据传输实例,can总线收集、汇总各个ECU的实时数据,通过CANTool传递到以UART或蓝牙串口连接的上位机中的CANToolApp中,并在CANToolApp以可视化手段实时的显示这些数据,用户同样可以通过上位机中的CANToolApp设定各种物理量的实际数值,传递到CANTool,发送到CAN总线上,最终将信息传达到对应物理量的电子控制元件(ECU),更改该项物理值。
上位机与CANTool装置之间的信息传送方式使用ASCII码(字符串)格式+ \r(即0x0d)方式进行信息交换。
即,每一个\r,代表了上位机的一条命令的结束,可以接收到的命令进行解析
现在对各个装置间的数据传输内容、传输格式、传输方向以及对应功能做简要说明
CAN总线数据 | dir | CANTool装置 | dir | CANToollApp | 功能说明 |
无 | - | 接收到“V\r”
返回CANTool装置的版本信息“SV2.5-HV2.0\r” | ←
→ | 发送“V\r”
接收“SV2.5-HV2.0\r” | 查询CANTooll版本信息 |
无 | - | 接收到“O1\r” 返回成功或失败信息。 | ← → | 发送“O1\r” \r或\BEL | CANTool装置置位(open),该功能仅可以在CANTool开启电源后(未开机)或处于复位状态(close)后(对CANTool发送"C\r")使用 如果成功,CANTool返回“\r”,否则返回\BEL(0x07) |
无 | - | 接收到“Sn\r” 返回成功或失败信息。 | ← → | 发送“Sn\r” \r或\BEL | 将CAN总线的通信速率调至Sn档 Sn对应的速率为: S0 :10Kbit S1 : 20Kbit S2 : 50Kbit S3 : 100Kbit S4 : 125Kbit S5 : 250Kbit S6 : 500Kbit S7 : 800Kbit S8 : 1Mbit 该功能仅可以在CANTool开启电源后(未开机)或处于复位状态(close)后(对CANTool发送"C\r")使用 如果成功,CANTool返回“\r”,否则返回\BEL(0x07)
|
无 |
| 接收到“C\r” 返回成功或失败信息。 | ← → | 发送“C\r” \r或\BEL | 对CANTool进行复位(close)操作,该功能仅可以在CANTool处于置位状态(open)后使用。 如果成功,CANTool返回“\r”,否则返回\BEL(0x07) |
ID(3位16进制数,范围0-2047)+DLC(1位,范围0-8,代表数据长度)+DATA(数据部分,长度0-8字节,由DLC的值决定) 在以下实例中0x代表16进制数据,为了方便阅读,data部分按照字节进行了拆分 实例1: id:0x123 DLC;0x08, Data:0x00,0x11,0x12, 0x13,0x14,0x15, 0x16,0x17 实例2: id:0x3FF DLC;0x04, Data:0x00,0x11,0x12, 0x13 | → | tiiiLDDDDDDDDDDODDDDD\r CANTool对CAN总线标准帧进行预处理,在数据前加t,在数据末尾加‘\r’
实例1:组成字符串如下 “t12380011121314151617\r”
实例2:组成字符串如下 “t3FF400111213\r”
| → | 接收到CANTools装置的信息,将其解析为实际的CAN信号。解析过程中需要使用CAN信息及信号描述数据库 | CAN总线发送CAN信号(标准帧),CANTool装置接收到CAN总线信息后会自动将信息发送给上位机。
|
ID(8位,范围0-536870911) +DLC(1位,范围0-8,代表数据长度)+DATA(数据部分,长度0-8字节,由DLC的值决定) 在以下实例中0x代表16进制数据,为了方便阅读,data部分按照字节进行了拆分 实例: id:0x123FABCD DLC;0x08, Data:0x00,0x11,0x12, 0x13,0x14,0x15, 0x16,0x17 | → | TiiiiiiiiLDDDDDDDDDDODDDDD\r CANTool对CAN总线扩展帧进行预处理,在数据前加T,在数据末尾加‘\r’
实例:组成字符串如下 “T123FABCD80011121314151617\r” 注:\r=0x0d | → | 接收到CANTools装置的信息,将其解析为实际的CAN信号。解析过程中需要使用CAN信息及信号描述数据库 | CAN总线发送CAN信号(扩展帧),CANTool装置接收到CAN总线信息后会自动将信息发送给上位机。 CANTool区分标准帧和扩展帧可以根据ID部分的最高位,如果为0,则为标准帧,为1为扩展帧。 |
ID: iiiiiiii DLC:L Data:DD DD … DD
实例: ID:1234567F DLC:8 DATA: 11 22 33 44 55 66 77 88 | ←
←
| CANTool装置将接收到的发送CAN扩展帧以一定频率发送到CAN总线。
实例:接收到 “T1234567F81122334455667788\r”
返回”\r” 或”\BEL” | ←
←
→ | TiiiiiiiiLDD…DDmmmm\r”。此字串是由用户在GUI界面上输入的CAN信号的内容合成而来,需要参照CAN信息及信号描述数据库。 ID(8位,范围0-536870911)+DLC(1位,范围0-8,代表数据长度)+DATA(数据部分,长度0-8字节,由DLC的值决定)+CYCLE(发送的频率,范围0-65535,代表周期发送的毫秒数,为0时代表只发送一次)
实例:单次发送 “T1234567F811223344556677880000\r”
“\r”或”\BEL”
| CANToolAPP向CANTool装置向CAN总线单次/周期性发送CAN扩展帧 该功能需要在置位状态(open)下完成 如果成功,CANTool返回“\r”,否则返回\BEL(0x07) |
ID: iii DLC:L Data:DD DD … DD
实例: ID:12F DLC:4 DATA:11 22 33 F4
|
← | CANTool装置将接收到的发送CAN标准帧以一定频率发送到CAN总线。
实例: 接收到需要发送的CAN数据
返回”\r” 或”\BEL”
然后,CANTool将以 周期mmmm= 0x0110= 272ms.发送此CAN数据 |
←
→
| “tiiiLDD…DDmmmm\r”。此字串是由用户在GUI界面上输入的CAN信号的内容合成而来,需要参照CAN信息及信号描述数据库。 ID(3位16进制数,范围0-2047)+DLC(1位,范围0-8,代表数据长度)+DATA(数据部分,长度0-8字节,由DLC的值决定)
实例:以定周期发送 “t12F4112233F40110\r”
“\r”或”\BEL”
| CANToolAPP向CANTool装置向CAN总线单次/周期性发送CAN标准帧 该功能需要在置位状态(open)下完成 如果成功,CANTool返回“\r”,否则返回\BEL(0x07) |
关于CAN信息,CAN信息有标准帧和扩展帧两种,格式为ID+长度+数据,一个CAN信息来自一个ECU,但是可能包含多个CAN信号。
CAN信息数据库内容如下
字段名 | 类型 | 样例 | 说明 |
BO_
| char[32] | BO_ | BO_,在实体数据库中CAN信息描述与CAN信号描述混合储存,BO_代表CAN信息,SG_代表CAN信号 |
id | uint32 | 2148606241 | 根据id最高位(第31位)区分该信息为CAN标准帧或CAN扩展帧,最高位位0,代表标准帧,最高位为1,代表扩展帧 |
100 | |||
Message Name | char[32] | EngMsg1 | 字符串,最长32字节,CAN信息名称 |
分隔符 | char[1] | : | 固定为 “:” |
DLC | unsigned char | 8 | 范围:0—8, 表示此CAN信息的DATA的长度 |
Node Name | char[32] | BODY_ECU | 字符串,最长32字节,代表发送此信息的Node名。也是ECU名 |
CAN信息样式:BO_ id Message_Name : DLC Node_Name\n 注:每个字段间间隔符除注明外,均使用空格作为分隔符,上述样例在数据库中保存的格式为。BO_开始于新的一行第0列,信息的末尾为”\n”即DOS换行符”0x0d 0x0a”。 实例:BO_ 2148606241 Ext1: 8 Node_Body |
CAN信号数据库内容如下
字段名 | 类型 | 样例 | 说明 |
SG_
| char[32] | SG_ | SG_,在实体数据库中CAN信息描述与CAN信号描述混合储存,BO_代表CAN信息,SG_代表CAN信号 |
Signal Name | char[32] | EngMsg1 | 字符串,最长32字节,代表该信号的名称 |
分隔符 | char[1] | : | 固定为 “:” |
起始位| bit长度@bit格式 | unsigned char[10] | 16|12@0+ | 16表示起始位编号 12 表示此CAN信息的DATA的长度为12bit 0+表示数据按Motorola的bit顺序排列,即大端序
|
16|12@1+ | 16表示起始位编号 12 表示此CAN信息的DATA的长度为12bit 0+表示数据按Intel的bit顺序排列,即小端序
| ||
(A,B) | Double | (0.1, -10) | A:分辨率,物理值最小单位精度,B:物理值的偏移量offset。 Phy=A*x+B, x为CAN信号的数值,phy为CAN信号对应的物理值 |
[C|D] | double | [-41|368.5] | 物理值的范围:Min=C到MAX=D |
物理单位 | Char[32] | “℃” | 带有双引号的字符串,可以为空:””, |
Node Name | char[255] | BODY_ECU | 接收该信号的节点Node名列表(也是ECU名)字符串,最长32字节。如果多个ECU接收此信号,则用逗号将多了节点名隔开,例如:BCM,PEPS,ICM,CDU |
CAN信号样式:SG_ Signal_Name : 起始位| bit长度@bit格式(1+\0+)(A,B) [C|D] 物理单位 Node_Name\n 注:每个字段间间隔符除注明外,均使用空格作为分隔符,上述样例在数据库中保存的格式为。SG_开始于新的一行第1列,信息的末尾为”\n”即DOS换行符”0x0d 0x0a”。 实例:SG_ sig1bittable : 8|1@1+ (1,0) [0|1] "" AC_ECU SG_ Sig_moto1 : 7|12@0+ (0.1,-41) [-41|368.5] "DegC" Node_Body SG_ CDU_NMWakeupOrignin : 23|8@0+ (1,0) [0|255] "ms" BCM,PEPS,ICM,CDU
|
在实际开发中,分别有小组模拟实现CANTool和实现CANToolApp的Windows和Android版本
根据问题描述文档,我们可以大致确定这两个软件分别的功能需求
CANToolApp
1、获取CANToolApp中所有可用的COM口列表,让用户选择映射有CANTool的COM,与CANTool连接,并进行初始设置,通过CANToolApp可以改变CANTool的运行状态(open,close),CAN传输速率,并将这些配置信息保存
2、能够以数值方式、仪表盘、实时曲线图等多种不同的方式显示CAN信号中的物理值及其实时变化
3、可以保存接收到的所有CAN信息,可以加载本地的CAN信息和CAN信号数据库,并以树状结构显示在GUI界面中,可以显示一条CAN信息的物理结构及信号分布情况
4、可以实现本地的CAN信息和CAN信号数据库/JSON或XML的相互转化
5、可以根据用户输入的物理量数值组装CAN信息,可以发送CAN信息,可以设置CAN信息的发送频率
6、可以将将所有CAN信息实时数据、CAN设定信息等 通过WEB API方式更新到远程数据库
7、......
CANTool
1、实时监听CAN总线和CANToolApp
2、根据CANToolApp的命令,做出对应的回应,如返回版本信息,置位(open)、复位(close)、设置传输速率
3、接收CAN总线的CAN信息,识别其为标准帧或扩展帧,做出对应的处理后发送给CANToolApp
4、接收CANToolApp的CAN信号和频率信息,能够按照指定的频率发送CAN信号到CAN总线
目前对需求中存在疑问的地方:
1、CANTool如何区分CAN标准帧和扩展帧?
CANTool装置不需要单独的识别CAN标准帧和扩展帧,CANToolApp接收和发送给CANTool装置的CAN信息中,以大写T开始的CAN信息是CAN扩展帧信息,以小写t开始的CAN信息是CAN标准帧信息。
2、小端序、大端序的详细样例?文档中给的样例比较难以理解
我们以Intel的字节、位的排列表为例
Intel的排序方式小端序,即起始位置存放数据最低位(LSB),即顺序读入的最右一位数据,数据位的排列顺序为:从起始位置开始,以低编号到高编号的顺序访问字节,同一个字节中从低位到高位存放数据,以16|12为例,12位数据的存放位置依次为16、17、18、19、20、21、22、23、24、25、26、27,16为LSB,27为MSB
Motorola的排序方式为大端序,即起始位置存放数据最高位(MSB),即顺序读入的最左一位数据,数据位的排列顺序为:从起始位置开始,以低编号到高编号的顺序访问字节,同一个字节中从高位到低位存放数据,以23|12为例,12位数据的存放位置依次为23、22、21、20、19、18、17、16、31、30、29、28,23为MSB,28为LSB
3、如何实现CANTool装置与CANToolApp的实时交互(输入输出重定向、进程间通信)?
需要实现实时通信,可是使用Arduino的硬件配合串口/蓝牙来实现虚拟的CANTool装置,需要编写Arduino的C/C++语言程序,此方式可以适用于Android/Windows开发。或使用纯软件的com0com0虚拟串口方式来模拟,此方法只适用于Windows APP开发。
有关com0com0虚拟串口的方式将在下一篇博客里面做一个详细的介绍。
4、CANTool模拟装置如何模拟监听的CAN总线发送CAN信息(预定义文档、随机函数)?
可以通过自己定义的数据模拟CAN总线的信息。但需要能够满足测试CAN信号的不同类型、排列方式及bit信息长度的Little Endian/Big Endian的需要
5、CANToolApp是否需要实现Web API?
不需要实现