首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

基于ARM 和Qt/E的车载HMI终端设计(2)

基于ARM 和Qt/E的车载HMI终端设计(2)

4 车载HMI终端的软件设计  4.1 CAN/RS232网关软件设计
   主程序中首先要完成初始化操作,  包括单片机、SJA1000、RS232通信以及中断源的初始化。其中SJA1000的初始化是整个设计最重要的部分,也是保证CAN  通信的前提。考虑车辆内部网络的兼容性,SJA1000配置为Peli模式,支持CAN2.0A和B规范,实现标准帧和扩展帧两种报文传输。 SJA1000初始化寄存器配置流程如图3所示。

  图3 SJA1000初始化寄存器配置流程为保证数据实时传输,采用中断方式进行数据收发。
  当CAN总线有数据接收时SJA1000会跳入接收中断函数将数据接收并存储到 接收缓存,根据数据帧头来判别数据类型和所带数据长度,最后提取CAN  数据拆分为单字节通过串口发送,并在HMI终端显示;当HMI终端有控制字发送,串口接收中断函数将所发送的控制字依次接收存入接收缓存,并根据首字节来 判别所发数据类型和长度,组装成CAN数据帧格式发送到网络中去,以此实现各节点的控制。具体流程如图4所示。

  图4 数据接收与发送流程图
  4.2 车载HMI界面的设计
  HMI界面采用Qt Creator2.0来设计,因为HMI终端是通过UART接口接入CAN网络中,所以通信时需接上面所介绍的CAN/RS232协议转换器来实现。同时,还需在Linux下编写Qt串口通信程序。
  首先,在Linux下利用open函数打开串口设备,用tcsetattr函数来设置串口属性。打开驱动设备UART0进行读写操作:const char*devName= “ /dev/ttySAC0”;fd = ::
   open (devName,O_RDWR|O_NONBLOCK);设置波特率等参数:serialAttr.c_cflag= B115200|  HUPCL|  CS8|CREAD|CLOCAL;serialAttr.c_cc[VMIN]=1;其中串口设备可使用Linux下I/O函数进行Read和 Write操作。但是,在数据接收时当数据量过大会导致界面被阻塞(造成界面假死),于是创建了一个线程通过事件驱动实现数据接收。
  Qt中可采用QSocketNotifier 类来实现设备事件驱动的设计要求。QSocketNotifier类关联Signal/Slot机制,当有数据可读时会触发Ativated信号,LCD   Number控件Slot会被调用来连接到该信号并显示,从而实现数据采集与显示功能。在数据发送时,可通过Button控件Signal/Slot调用 QObject对象的connect()函数来实现[3]。当按键被按下时触发Signal信号,Slot会调用pressed  ()函数将定义好的数据通过串口Write函数发送到总线上。函数实现如下:
  void Glass::on_lu_pressed(){char msg[]= {160,34,16,0};//定义所发送数据myserial-》myCom-》write(msg,4);//写发送数据}
  通过QPainter类进行对窗体界面和按键图像界面进行设计,达到美观的人机界面。最后将设计好的程序通过交叉编译,生产二进制文件移植到ARM 中,然后在文件系统中调用执行,最终在LCD触摸屏上显示,如图2所示。
  5 系统集成与测试
   首先将设计好的HMI终端通过交叉串口线与PC机连接,进行相互通信,测试是否能够进行数据收发,测试成功后通过CAN/RS232网关接入Polo车 CAN试验台进行综合测试。试验台设备节点可通过触摸方式控制,同时可实时采集与显示运行状态信息,经过多次实验测试,运行稳定可靠,达到了设计要求。
  6 结束语
  本文所设计的车载HMI终端集车身控制、仪表显示、导航、多媒体和无线上网为一体,简化了车载中控平台,降低了车辆控制系统操作的复杂性。经实验测试实现了车身设备的触摸控制,能够对各设备运行状态信息进行采集与显示。为车载HMI开发提供了一种可行的设计思路与性价比更合理的解决方案。
继承事业,薪火相传
返回列表