随着机动车保有量的增加,产生了交通堵塞、事故频发等一系列问题。车联网的研究引起各国政府和相关机构的高度重视。为了公路运输进行信息化的管理,提出了车联网关键技术的研究课题,主要涉及车联网终端的研究,课题中同时需要考虑到测试环境的搭建、以及进行车联网终端系统测试。SAE J1939协议基于Bosch公司开发的CAN(controller area network),作为描述重型车辆现场总线的一种网络应用,被广泛应用于商用车辆,如大型客车和重型货车。现在大部分的测试环境大都是基于CANPro协议分析平台和CAN总线分析仪组合搭建[1],而其存在的主要问题是现有的CAN总线分析仪的价格较高。考虑到研究课题的现实需求,本系统通过MCU控制CAN收发器替代CAN总线分析仪,很好地降低了项目成本。
1 系统整体结构
该系统由主要由PC端上位机和CAN节点收发端2部分组成,系统的整体结构图如图 1所示。
上位机方面,考虑到上位机的应用范围,该系统采用Qt这样一款跨平台C++图形化界面库开发。Qt良好的跨平台性、丰富的API以及对于第3方类的支持使得开发更为方便,同时Qt的良好封装机制,较好的可重用性,大量的开发文档,使其非常便于用户开发[2]。由于在Qt库中没有具体的串口控制类,在系统中这里使用的是第3方的qextserialport类来实现串口通信,将上位机车辆仿真环境数据发送到MCU。下位机方面,系统采用MCU、MCP2515控制器及TJA1050高速CAN收发器组合的设计,进行与上位机的通信和CAN报文的发送[3]。
2 系统硬件设计
系统采用STC89C52RC作为主控芯片,其作为一种低功耗、高性能CMOS 8位微控制器,具有8KB系统可编程Flash存储器,很好地满足系统编程的需求。主控芯片通过RS-232串口芯片接收串口数据并通过CAN模块进行报文发送,CAN总线模块采用Microchip的MCP2515独立CAN协议控制器芯片和Philips的CAN高速收发器TJA1050进行组合。MCP2515完全支持CAN V2.0B技术规范,并能进行标准帧和扩展帧的收发,其自带2个验收屏蔽寄存器和6个滤波寄存器,可以进行报文有效性过滤[4]。MCU通过SPI接口与该器件进行连接,使用标准的SPI读/写指令以及专门的SPI命令来读/写所有的寄存器[5]。TJA1050作为物理媒体连接子层连接于协议控制器和物理传输媒体之间,具有较好的电磁兼容性,电磁辐射极低,电磁抗干扰性极高,同时不上电的节点总线呈现无源特性。TJA1050可以为总线提供差动发送性能,为CAN控制器提供差动接收性能;同时TJA1050具有保护总线引脚,可防止汽车环境中的瞬态干扰,更好的应用于汽车CAN总线的环境中[6]。具体硬件电路如图 2所示。
3 系统软件设计
系统软件由上位机软件和下位机软件2部分组成。上位机主要包括基于Qt的串口通信程序和基于Qt的图像化界面设计。由于在Qt中并没有特定的串口控制类,所以基于Qt的串口通信程序使用第3方写的qextserialport类进行开发,通信分为手动发送和自动发送。Qt的图形化界面的设计主要是基于qwt控件进行仪表盘的设计,并完成发送数据的实时调整。下位机设计主要是以MCU作为控制芯片,完成串口数据的接收、解码,并提取发送到CAN总线上。
3.1 上位机程序设计
上位机程序主要包括串口通信程序和图形化界面设计2部分。
3.1.1 串口通信程序设计
为了实现Qt下串口通信的实现,这里基于第3方qextserialport类进行开发[7],下面将关键步骤介绍如下:
1)由于Qt库没有特定的串口控制类,所以首先要下载qextserialport-1.2win-alpha.zip,并进行解压。由于该上位机是运行在Windows下,这里需要将相应的文件拷贝到工程当中,在Windows下只需要使用其中的6个文件:qextserialbase.cpp和qextserialbase.h,qextserialport.cpp和qextserialport.h,win_qextserialport.cpp和win_qextserialport.h。
2)打开QtCreator,新建工程,将上述6个文件复制到工程文件夹中,并在工程中添加这6个文件。此时,串口通信的开发环境搭建完成。
3)接下来进行串口的设置的界面设计,包括串口号、波特率、数据位、校验位和停止位。
4)通过信号/槽机制编写各个按钮函数,如打开串口按钮、关闭串口按钮,自动发送按钮对应的函数的编写。
5)串口读写数据函数的编写,为了方便并有效地发送数据,这里通过自定义报文进行发送并增加校验位,减少误码率。
串口通信图像化界面如图 3所示。
3.1.2 图形化界面设计
在图形化界面设计上,为了更直观地显示参数,这里采用基于qwt的仪表盘设计,下面将图形化界面设计关键步骤介绍如下[8]。
1)下载最新的qwt,这里下的是qwt-6.1.0.zip,并解压后编译,配置。
2)注意在使用时,需要设置一下pro文件,在pro文件下加入如下语句:
include(C:/Qt/qwt-6.1.0/qwtfunctions.pri)
DEFINES *= QWT_DLL
CONFIG += qwt
INCLUDEPATH += C:/Qt/qwt-6.1.0/src
DEPENDPATH += C:/Qt/qwt-6.1.0/src
qwtAddLibrary(qwt)
3)这里通过对QwtDial控件参数的配置获取合适的仪表盘,如车速表、转速表、油量表和油压表等。并且通过QwtWheel控件进行数据的调整。
3.2下位机软件设计
下面主要针对下位机软件的设计流程进行分析[9]。如图 4所示,当函数从主函数开始运行时首先进行初始化程序,其包括串口初始化init_serial()来完成串口工作方式、波特率、数据位的设置,CAN模块初始化Init_Can()来完成Mcp2515工作方式、通信速率、采用中断方式的设置,采用串口中断方式进行上位机发送数据的接收,主函数对接收的报文数据进行解析,并将解析后的CAN信息按相应节点发送到CAN总线上[10]。
4 系统测试
将所有硬件模块连接好,各CAN节点的CAN_H端接在一起,CAN_L端接在一起,将车联网系统连接本系统进行测试。
首先如图 5所示,发送的数据为车速60 km/h、转速3 988 r/min、油量60%、油温120 ℃、油压600 kPa。将这些数据处理成相应的格式进行串口发送,其格式为“$,油温,油压,油量,油量,转速,*”,对应的数据格式为“$,120,0600,060,060,3988,*”。
MCU通过串口接收到数据后进行解析,并以对应的SAE J1939节点进行发送,发送的相应节点信息如表 1所示。
这里用项目中车联网系统进行接收本系统发送的CAN数据进行测试,车联网系统基于嵌入式系统开发,用MCP2515模块接收数据,并显示在Qt界面上,显示结果如图 6所示。同时进行了自动发送测试,在上位机修改数据可以实时地显示在车辆网系统上,通过长时间车联网终端的显示,可以很直观地测试了系统的准确性、稳定性和可靠性。
5 结束语
本系统模拟了基于SAE J1939的车载CAN总线,充分利用Qt的图形化界面编程的良好封装机制,结合signals/slots机制和丰富的API,降低了用户开发难度,更简单快捷完成串口通信和图形化界面的开发。同时其丰富的可扩展性使得图形化界面更加直观。本系统的工作较为直观,并在充分满足功能的同时大大的降低了研发成本,经过测试该系统性能可靠稳定,很好地满足车联网系统对于测试环境的要求,另外对该系统软件进行包装,能够在window系统下良好运行。
本系统设计在满足项目需要的同时,还可以应用于简单汽车网络的模拟和CAN总线培训教学。在整个系统的开发过程中,可以很好地了解并熟悉车辆仪表盘的设计和基于J1939的车辆CAN通信。
[1] | 吴伟斌, 李礼夫, 刘落实, 等. 基于J1939的汽车CAN总线教学实验系统[J]. 微计算机信息, 2008, 6(2): 274-276. |
[2] | 吴迪. 零基础学Qt4编程[M]. 北京: 北京航空航天大学出版社, 2010: 10-28. |
[3] | 许勇, 廖爽, 赵检群, 等. 基于SAE J1939协议的发动机数据采集显示系统[J]. 桂林电子科技大学学报, 2013, 33(3): 205-209. |
[4] | 龚文, 张辉, 陈超. 基于 CAN 总线的电动汽车车载监控终端[J]. 计算机与现代化, 2013(11): 192-195. |
[5] | 谢桂波. 基于SPI的CAN总线控制器与MCS-51单片机的接口设计[J]. 电子设计应用, 2010(1): 50-52. |
[6] | 邢洋, 李立伟, 张洪伟. 基于STM32单片机的CAN总线分析仪的设计[J]. 青岛大学学报: 工程技术版, 2013, 28(1): 19-21. |
[7] | 霍亚飞. Qt编写串口通信程序全程图文讲解[EB/OL]. [2014-05-08]. http://blog.csdn.net/yafeilinux/article/details/4717706. |
[8] | 王旭峰. 基于嵌入式技术的风机运行状态在线监测系统开发[D]. 北京: 北京工业大学, 2012: 45-46. |
[9] | 陈云芳. 基于ARM-Linux的车联网终端技术研究[D]. 哈尔滨: 哈尔滨工程大学, 2013: 61-65. |
[10] | SAE J1939-71, Vehicle Application Layer[S]. |