3.1 程序流程图如下
3.2 CAN接收程序
为了便于程序的移植和修改,本接收程序定义了一个结构,部分代码如下:
unsigned char InputCAN( unsigned char msg_num )
{unsigned char p;p=0;RUN = 0x01; /*开始接收*/
if(Receive_message[1].DSTAT.DN==1){p |= 1;
Buf_Speed=((int)Receive_message[1].DATA[0]<<8)|Receive_message[1].DATA[1];//接收车速数据Buf_Speed
Receive_message[1].DSTAT.DN=0;Receive_message[1].DSTAT.MUC=0;}
RUN = 0x01; /*开始接收*/
if(Receive_message[2].DSTAT.DN==1){p|=2;
Buf_Rpm=((int)Receive_message[2].DATA[0]<<8)|Receive_message[2].DATA[1];//接收转速数据Buf_Rpm
Receive_message[2].DSTAT.DN=0;Receive_message[2].DSTAT.MUC=0;}
RUN = 0x01; /*开始接收*/
if(Receive_message[3].DSTAT.DN==1){p |= 4;
Buf_Fuel=((int)Receive_message[3].DATA[0]<<8)|Receive_message[3].DATA[1];//燃油数据Buf_Fuel
Receive_message[3].DSTAT.DN=0;Receive_message[3].DSTAT.MUC=0;}
RUN = 0x01; /*开始接收*/
if(Receive_message[4].DSTAT.DN==1){p |= 8;
Buf_Winker=((int)Receive_message[4].DATA[0]<<8)|Receive_message[4].DATA[1];//水温数据Buf_Water
Receive_message[4].DSTAT.DN=0;Receive_message[4].DSTAT.MUC=0;}
RUN = 0x01; /*开始接收*/
if(Receive_message[5].DSTAT.DN==1){p |= 16;
Buf_Winker=((int)Receive_message[5].DATA[0]<<8)|Receive_message[5].DATA[1];//接收报警灯和指示信号Buf_Winker
Receive_message[5].DSTAT.DN=0;Receive_message[5].DSTAT.MUC=0;}
RUN = 0x01; /*开始接收*/
if(Receive_message[6].DSTAT.DN==1){p |= 32;
Buf_CanData=((int)Receive_message[6].DATA[0]<<|Receive_message[6].DATA[1];//接收其他数据Buf_CanData
Receive_message[6].DSTAT.DN=0;Receive_message[6].DSTAT.MUC=0;}
RUN = 0x01;/*开始接收*/
return p;//1:车速信号,2:转速数据;4:燃油数据 8:水温数据 16:报警灯指示数据 32:其他数据 其他:接收数据无效
}
4.结束语
由于本仪表系统中采用了CAN 总线, 大大减少了仪表板与车载其它电子设备间通信用电缆的数量和接插件的数量和种类,提高了系统的鲁棒性,同时系统通过充分利用车载网络的优势,实现数据共享,降低了系统成本,提供汽车仪表的控制精度,本CAN通信软件已经通过验证,可以满足汽车仪表的通信要求,鉴于CAN 的应用优势和发展前景,并考虑到它在国外尚未定型,在国内也有很多应用空白,我国汽车业可以在引进、消化、吸收的基础上,配合CAN的推广工作抓紧制定符合国情的CAN技术标准,形成自主产权的汽车控制网络系统。