Can通信模块详细设计说明书
- 格式:docx
- 大小:256.34 KB
- 文档页数:21
汽车CAN总线详解概述CAN(Controller Area Network)总线协议是由 BOSCH 发明的一种基于消息广播模式的串行通信总线,它起初用于实现汽车内ECU之间可靠的通信,后因其简单实用可靠等特点,而广泛应用于工业自动化、船舶、医疗等其它领域。
相比于其它网络类型,如局域网(LAN, Local Area Network)、广域网(WAN, Wide Area Network)和个人网(PAN, Personal Area Network)等,CAN 更加适合应用于现场控制领域,因此得名。
CAN总线是一种多主控(Multi-Master)的总线系统,它不同于USB或以太网等传统总线系统是在总线控制器的协调下,实现A节点到B节点大量数据的传输,CAN网络的消息是广播式的,亦即在同一时刻网络上所有节点侦测的数据是一致的,因此比较适合传输诸如控制、温度、转速等短消息。
CAN起初由BOSCH提出,后经ISO组织确认为国际标准,根据特性差异又分不同子标准。
CAN国际标准只涉及到 OSI(开放式通信系统参考模型)的物理层和数据链路层。
上层协议是在CAN标准基础上定义的应用层,市场上有不同的应用层标准。
发展历史1983年,BOSCH开始着手开发CAN总线;1986年,在SAE会议上,CAN总线正式发布;1987年,Intel和Philips推出第一款CAN控制器芯片;1991年,奔驰500E 是世界上第一款基于CAN总线系统的量产车型;1991年,Bosch发布CAN 2.0标准,分 CAN 2.0A (11位标识符)和 CAN 2.0B (29位标识符);1993年,ISO发布CAN总线标准(ISO 11898),随后该标准主要有三部分:ISO 11898-1:数据链路层协议ISO 11898-2:高速CAN总线物理层协议ISO 11898-3:低速CAN总线物理层协议注意:ISO 11898-2和ISO 11898-3物理层协议不属于BOSCH CAN 2.0标准。
can总线第二章can总线系统原理CAN总线是一种串行通信总线,广泛应用于汽车电子系统、工业自动化和航空航天等领域。
CAN总线的设计目标是提供高可靠性、实时性和可扩展性的通信解决方案。
本文将详细介绍CAN总线的系统原理。
CAN总线系统由以下几个主要组成部分构成:CAN控制器、CAN收发器、CAN总线和节点。
CAN控制器负责管理和控制通信过程,而CAN收发器则负责将控制器发送的数字信号转换为电压信号,并将接收到的电压信号转换为数字信号。
CAN总线是连接各个节点的物理介质,节点则是CAN 总线上的设备或系统。
CAN总线采用差分信号传输,即通过两条线分别传输正负两个信号。
这种差分传输方式可以减小干扰对信号的影响,提高通信的可靠性。
CAN 总线使用非归零码(NRZ)编码方式,即不使用0和1两种信号电平来表示数据,而是使用高低电平的变化表示数据位的变化。
CAN总线采用了CSMA/CD(载波监听多路访问/冲突检测)的工作方式。
在CAN总线上,每个节点都可以发送和接收数据。
当一个节点要发送数据时,它首先监听总线上是否有其他节点正在发送数据。
如果没有冲突,则该节点发送数据;如果发现冲突,则停止发送数据,并等待一个随机的时间后再次尝试发送。
CAN总线支持广播和点对点通信。
广播是指一个节点向所有其他节点发送相同的数据,而点对点通信是指一个节点向另一个节点发送特定的数据。
广播通信可以实现消息的快速传播,而点对点通信可以实现节点之间的私密通信。
CAN总线提供了多种帧类型,包括数据帧、远程帧和错误帧。
数据帧用于传输实际的数据,远程帧用于请求其他节点发送数据,而错误帧用于传输错误信息。
每个帧都包含标识符、控制位、数据和校验字段。
标识符用于唯一标识每个帧,控制位用于指示帧的类型,数据字段用于存储实际的数据,而校验字段用于检测数据传输过程中是否发生错误。
CAN总线具有很高的实时性和可靠性。
它支持多个节点同时发送和接收数据,并且可以在微秒级的时间内完成数据传输。
CAN link通信及自由指令使用说明书汇川PLC的CANRX指令属于自由指令,用来读取PLC的CAN控制器接收到的数据。
该指令通过判断接收到的数据的ID(仲裁标识符)与指令ID是否相同以判断接收到的数据是不是有效,用于不支持CANlink协议的设备和PLC之间的通信。
CANRX指令通常情况下和CANTX指令配合使用,一般是用CANTX去读取或写入数据,用CANRX接收返回。
由于指令设计为异步指令,所以接收过程中有可能存在接收不到数据或接收到数据错位的问题,因此用户在使用过程中要对其使用情况进行设置,详细说明如下:模式1:设置PLC仅支持自由协议1.1:设定CANRX指令使用标志,设置M8283为1。
1.2:设置M8283之后表示对不支持CANlink协议的设备进行访问,不再支持FROM,TO指令。
1.3:采用CANRX指令对同一返回ID的同一设备的不同数据要分时段进行,否则会发生接收错位。
1.4:采用CANRX指令对同一返回ID的不同设备的不同数据要分时段来进行,否则会发生接收错位。
模式2:设置PLC支持自由指令和CANlink协议同时使用2.1:设定自由指令和CANlink协议同时使用标志,设置M8282为1。
(M8283必须设置为0)2.2:用户用自制设备与PLC进行数据交互时,必须不得使用CANlink协议使用过的标识符,及29位仲裁标识符的高4位(bit28,bit27,bit26,bit25)不得为(1000,1010,1011,1101),如果使用此标识符会导致不支持CANlink协议的设备发送的数据被PLC当做支持CANlink协议设备发送的数据错误接收。
2.3 采用CANRX指令对同一返回ID的同一设备的不同数据的接收要分时段进行,否则会发生接收错位。
2.4 采用CANRX指令对同一返回ID的不同设备的不同数据的接收要分时段来进行,否则会发生接收错位。
2.5 在此情况下发送的ID高29位非(1000,1010,1011,1101)的数据不再当CANlink的错误帧处理。
GCAN-305嵌入式CANopen(从站)转UART用户手册文档版本:V3.02 (2015/8/11)修订历史版本日期原因V1.00 2013/6/16 创建文档V2.01 2013/12/20 修正设备工作参数V3.01 2014/10/22 添加部分参数V3.02 2015/8/11 修正部分参数目录1. 功能简介31.1 功能概述31.2 性能特点31.3 静态参数41.4 典型应用52. 设备安装52.1 系统连接结构52.2 模块接口定义63. 设备使用73.1 GCAN-305配套评估板73.2 模块状态转换83.3 系统状态指示灯93.4 GCAN-305节点ID与CAN总线波特率94. GCAN-305中使用CANopen协议(DS301)114.1 GCAN-305预定义连接114.2 GCAN-305操作135. GCAN-305串口操作275.1 串口通信协议275.2 GCAN-305操作命令295.3 GCAN-305串口操作错误响应45附录A:CANopen协议简介46附录B:串口可操作对象字典列表53附录C:GCAN-305对象字典55销售与服务错误!未定义书签。
1. 功能简介1.1 功能概述GCAN-305是广成科技有限公司开发的嵌入式CANopen从站通信转换模块。
该模块内部已经集成了CANopen从站协议栈代码,不需要用户进行二次开发。
协议栈遵循CANopen协议描述文档DS301、DS302、DS303以及DS305标准。
在默认情况下,CANopen从站启用预定义连接,并支持参数存储。
GCAN-305模块提供一路CAN接口,通过该接口可以与CANopen网络进行连接。
另外GCAN-305提供两个UART接口——一个通信UART接口(通信波特率为1200~115200bps),一个调试UART接口(固定波特率为115200bps)。
GCAN-305模块适用于任何具有串口通信能力的系统,通过搭载该模块,用户现有的串口通信设备可以以最快的速度拥有CANopen通信能力,抢占市场先机。
24V系统-CAN通讯协议说明书(内部文件)2. 范围 (2)3. 网络拓扑 (3)3.1 模块地址表: (3)4. 报文格式 (4)4.1 状态信息报文 (4)4.1.1 开关量消息组1 (4)4.1.2 开关量消息组2 64.1.3 各种数值量消息 (7)4.1.4 故障消息 (8)4.1.5 仪表指示灯消息组 1 (10)4.1.6 仪表指示灯消息组 2 (11)4.2 控制类报文 (11)4.3 网络管理类报文 (14)4.3.1 系统休眠消息 (14)4.3.2 系统唤醒消息 (14)4.3.3 模块重启通知消息 (14)4.3.4 请求模块重启消息 (15)4.3.5 请求模块软件版本消息 (15)4.3.6 请求模块硬件版本消息 (16)4.3.7 模块网络心跳消息 (17)4.3.8 网络时钟消息 (17)4.4 其他报文 (18)4.4.1 应答消息 (18)5. 仪表相关报文 (18)1. 目的24V网关和车身控制系统(以下简称24系统)是基于CAN网连结而成的,CAN网络是整个系统的基础。
所以很有必要详细说明下该系统中的CAN 网络协议,这也是编写本文档的主旨。
本文档仅供内部开发人员使用,包括NCM 组和仪表组。
2. 范围本文编写的范围仅仅限于24V系统中采用的基于CAN的J1939应用协议的报文格式,不适用所有的网关和车身控制系统。
本文档并不是介绍CAN网络和J1939应用协议文档,而了解文档中设计的J1939协议关联的术语,请参看相关的技术文档。
3. 网络拓扑24V系统的详细介绍详见其他相关文档,如系统概要设计,详细设计等,在这里简单介绍一下系统的网络拓扑图,使读者有一个简单直白的了解,以便于更好的理解文档中涉及的CAN网络和J1939协议。
总所周知,CAN协议早在80年代就已经由德国的博世公司开发应用于汽车电子领域了,到了1991年,Philips Semiconductors公司制定发布了CAN技术规范2.0版本,分为A 和B两部分,2.0A部分给出了CAN报文的标准格式,2.0B部分为扩展部分。
NJ400CMM401-0104 CANOpen主站模块使用说明书V1.00傲拓科技股份有限公司2023年01月目录第一章 NA400CMM401-0104硬件手册 (1)1.1 概述 (1)1.2 订货号 (1)1.3 特性 (1)1.4 模块外观 (2)1.5 指示与诊断 (2)1.6 技术规范 (3)第二章 NA400CMM401-0104使用说明 (4)2.1 主站配置软件安装 (4)2.2 主站配置软件使用 (5)2.2.1 安装EDS文件 (5)2.3 配置主站/从站网络 (9)2.3.1 手动配置 (9)2.3.2 在线扫描 (17)2.4 配置文件的下载 (18)2.5 使用案例 (19)2.5.1 配置CPU和CMM通讯的输入输出区: (19)2.5.2 CANOpen网络配置 (19)2.5.3 输入输出数据区读写 (21)第一章 NA400CMM401-0104硬件手册1.1概述NA400CMM401-0104CANOpen主站模块是运行于PLC系统中的通讯模块,该模块扮演的角色是让NA400PLC系统能够方便的接入到CANOpen网络,实现PLC 与CANOpen总线上其它从站设备的数据交换,即负责将PLC 的数据传送给总线上的从站设备,同时也负责将总线上其他从站设备返回的数据传回PLC,从而实现数据交换。
1.2订货号1.3特性NA400CMM401-0104 CANOpen主站模块具有以下特性:⚫独立完成通讯任务,既可以与NA400 CPU 数据交换,也可以与 DP从站数据交换;⚫与NA400CPU模块的数据交换单独使用一路内部网,与 I/O 模块的内部网分离减轻内部网通讯的负担;⚫符合CANopen标准协议DS301v4.02;⚫支持NMT Master 服务;⚫错误控制:支持Heartbeat /Node Guarding Protocol ;⚫通讯节点数:最大 127 个节点(包括主站,主站是0号节点);⚫支持PDO服务:◼RxPDO数据量最大400字节,TxPDO数据量最大400字节;◼每个从站最多可配置4个TxPDO和4个RxPDO ;◼PDO映射:每个PDO最大可以映射32个参数,但总共加起来不能超过8个字节;⚫支持SDO服务;⚫支持Emergency Protocol,并在组态软件窗口显示;⚫支持同步信号产生(SYNC producer,range 0-65535ms );⚫作为NACANopenBuilder配置软件,可以通过CANOpen主站模块直接对网络进行组态;⚫支持标准波特率:125kbps、250kbps、500kbps;⚫全面的LED指示功能;⚫ 掉电不丢失配置参数,上电后CPU 自动进行参数加载; ⚫ 支持热插拔。
广州致远电子股份有限公司CAN 接口卡系列产品CAN 测试软件与接口函数使用手册类别 内容关键词CANTest 通用测试软件、CAN 接口函数库使用摘要 本软件可适用于广州致远电子股份有限公司出品的各种CAN 接口卡。
CANTest 测试软件可进行数据收发、查询等基本传输功能。
是CAN 总线测试的必备软件。
CAN 接口函数库是提供给用户进行上位机二次开发,可以自行编程进行数据收发、处理等。
修订历史目录1. 测试软件使用说明 (1)1.1.设备操作 (1)1.1.1.设备类型选择 (1)1.1.2.滤波设置 (2)1.1.3.启动CAN (2)1.1.4.获取设备信息 (3)1.1.5.发送数据 (3)1.1.6.接收时间标识 (3)1.1.7.隐藏发送帧与显示发送帧 (4)1.1.8.DBC解码与按ID分类显示 (4)1.1.9.实时保存与停止保存 (4)1.1.10.总线利用率 (5)1.1.11.错误信息显示 (5)1.2.辅助操作 (6)1.2.1.帧ID显示方式 (6)1.2.2.帧ID显示格式 (6)1.2.3.继续显示发送和接收的数据 (6)1.2.4.暂停显示发送和接收的数据 (6)1.2.5.滚动 (6)1.2.6.显示帧数 (6)nguage (6)2. 接口函数库说明及其使用 (7)2.1接口卡设备类型定义 (7)2.2接口库函数使用流程 (8)2.3驱动的特色与工作原理 (9)2.4错误码定义 (10)2.5函数库中的数据结构定义 (10)2.5.1VCI_BOARD_INFO (10)2.5.2VCI_CAN_OBJ (11)2.5.3VCI_CAN_STA TUS (12)2.5.4VCI_ERR_INFO (13)2.5.5VCI_INIT_CONFIG (14)2.5.6CHGDESIPANDPORT (15)2.5.7VCI_FILTER_RECORD (16)2.5.8VCI_AUTO_SEND_OBJ (16)2.6接口库函数说明 (18)2.6.1VCI_OpenDevice (18)2.6.2VCI_CloseDevice (19)2.6.3VCI_InitCAN (20)2.6.4VCI_ReadBoardInfo (22)2.6.5VCI_ReadErrInfo (22)2.6.6VCI_ReadCANStatus (27)2.6.7VCI_GetReference (28)2.6.8VCI_SetReference (31)2.6.9VCI_StartCAN (34)2.6.10VCI_ResetCAN (34)2.6.11VCI_GetReceiveNum (36)2.6.12VCI_ClearBuffer (36)2.6.13VCI_Transmit (38)2.6.14VCI_Receive (39)3. 接口库函数使用方法 (40)3.1VC调用动态库的方法 (40)3.2VB调用动态库的方法 (40)3.3接口库函数使用流程 (42)3.4Linux下动态库的使用 (43)3.4.1驱动程序的安装 (43)3.4.2USBCAN-I/II/I+/II+驱动的安装 (43)3.4.3PCI-9820驱动的安装 (43)3.5动态库的安装 (43)3.6动态库的调用及编译 (43)4. 参考资料 (44)5. 免责声明 (45)1. 测试软件使用说明CAN-bus 通用测试软件是一个专门用来对所有的ZLGCAN系列板卡进行测试的软件工具,此软件操作简单,容易上手,通过运用此软件可以非常方便的对板卡进行测试,从而熟悉板卡的性能,其主界面如下:1.1. 设备操作1.1.1. 设备类型选择在进行操作之前,首先得从“类型”菜单中选择您想要操作的设备类型,如下图所示:此时会弹出“选择设备”对话框:在这个对话框中您可以选择您要打开的设备索引号和CAN通道,以及设置CAN的初始化参数,然后点“确定”按钮来打开设备操作窗口(或者也可以点击“确定并启动CAN”按钮打开设备操作窗口并自动打开设备和启动CAN通道)。
stc单片机的can通信代码概述及解释说明1. 引言1.1 概述本篇长文将详细介绍STC单片机的CAN通信代码,并对其进行解释和说明。
CAN(Controller Area Network)通信是一种广泛应用于工业控制领域的串行总线通信协议,具有高可靠性和实时性的特点。
1.2 文章结构本文分为五个主要部分,分别概述如下:- 第2部分:对STC单片机CAN通信代码进行概述,包括CAN通信简介、STC单片机及其特点以及STC单片机与CAN通信的应用场景。
- 第3部分:详解CAN通信实现代码,在这一节中将涵盖硬件连接与配置步骤、初始化CAN模块设置以及发送数据代码解析等内容。
- 第4部分:解析和应用案例分析接收数据的代码,在这一节中将探讨接收缓冲区配置与接收中断处理函数设计、数据接收与处理过程演示以及实际应用案例分析与问题解决思路分享。
- 第5部分:总结文章并展望未来发展方向,包括实验结果总结与讨论以及技术问题、改进方向及未来发展展望等内容。
1.3 目的本文的目的在于全面介绍STC单片机的CAN通信代码,并对各个功能进行详细解释和说明。
读者通过本文可以了解CAN通信协议的基本原理、STC单片机的特点以及其与CAN通信的应用场景,同时还能具体了解如何实现CAN通信的初始化设置、发送数据以及接收处理等关键步骤。
此外,本文还希望通过实际应用案例分析分享解决问题的思路,为读者提供一些启发和参考。
2. STC单片机CAN通信代码的概述2.1 CAN通信简介CAN(Controller Area Network)总线是一种广泛应用于工业领域的串行通信协议。
它具有高性能、实时性强以及可靠性高等特点,被广泛用于汽车电子、工业自动化、机器人控制和航空航天等领域。
2.2 STC单片机及其特点STC单片机是一种常见的8位微控制器,由STC公司开发和生产。
它具有低功耗、易于编程和使用的特点,并且价格相对较低。
STC单片机广泛应用于各个领域,在嵌入式系统中扮演着重要角色。
Can.cpp模块设计说明1.总则:传送故障记录数据或运行记录数据时,不传送参数数据和实时数据。
传送参数数据和实时数据可同时传送。
在界面层:1.读故障记录数据BUTTON和运行记录数据BUTTON和记录实时数据BUTTON没有按下,参数没有操作时,才能按下读故障记录数据BUTTON或运行记录数据BUTTON。
否则弹出信息框。
2.按下故障记录数据BUTTON后,把运行记录数据BUTTON和记录实时数据BUTTON变灰,参数MENU和参数界面上的读和修改BUTTON变灰,故障记录数据读完后,上述按钮复原。
对按下运行记录数据BUTTON作同样处理。
3.按下记录实时数据BUTTON时,把故障记录数据BUTTON和运行记录数据BUTTON变灰。
按下停止记录实时数据BUTTON时, 把故障记录数据BUTTON和运行记录数据BUTTON复原。
4.对参数上载和修改时,把故障记录数据BUTTON和运行记录数据BUTTON变灰,完成操作后把故障记录数据BUTTON和运行记录数据BUTTON复原。
CAN和以太网类似,相应7种事件:关闭CAN、实时数据请求、读参数、写参数、发送心跳报文,读故障记录,读运行记录。
2功能模块类名为:Class Can类对象定义在Can.cpp中,是一个全局对象。
Class Lan g_Can;该模块的功能为:1. 通过USB转CAN与下位机进仃头时数据请求和参数的上传下载读运行记录;,读故障记录,2. 通过PCI插卡与下位机进仃头时数据请求和参数的上传下载运行记录;,读故障记录,读3. 出错处理。
3流程逻辑CAN部分由线程CanThread(宽成5个事件。
OpenCan ( DWORD DevType , DWORD DevIndex , DWORD Reserved )函数通过调用API 函数VCI_OpenDevice (DWORD DevType , DWORD DevIndex , DWORD Reserved )打开CAN;CloseCan ( DWORD DevType , DWORD DevIndex )函数通过调用API 函数VCI_CloseDevice(DWORD DevType , DWORD DevIndex)关闭CAN ;StartCanThread ()函数用于开启Can线程;SuspendedCanThread ()函数用于关闭线程;CanThread ()为Can线程函数,用于执行五种事件:关闭Can、发送实时数据请求、读参数、写参数和发送心跳报文。
SendCanPacket(int iEvent, int Index = 0 , int SubIndex = 0 , *Data = NULL)为CAN 发送报文函数,iEvent为事件值,Index、SubIndex、Data用于参数的读写事件。
根据不同的事件,发送相应的报文。
RecvCanPacket()JudgeOvertime();以上函数形参封装在以下的数据结构中:typedef struct _CAN_DEVICE_PARM_{DWORD dwDevType; 〃设备类型号DWORD dwDevIndex; 〃设备索引号DWORD dwReserved; 〃保留DWORD dwCANIndex; //Can 第几路DWORD dwChecCode;// 验收码DWORD dwMask; // 屏蔽码DWORD m_dwMode; // 模式int iTimer0; // 定时器int iTimer1; // 定时器int iFilterType;// 滤波方式}CAN_DEVICE_PARM;typedef struct _VCI_CAN_OBJ{UINT uiID;UINT uiTimeStamp;BYTE byTimeFlag;BYTE bySendType;BYTE byRemoteFlag;// 是否是远程帧BYTE byExternFlag;// 是否是扩展帧BYTE byDataNbytes;BYTE byDataBuf[8];BYTE byReserved[3];}VCI_CAN_OBJ,*PVCI_CAN_OBJ ;成员uiID :报文ID ;uiTimeStamp :接收到信息帧的时间标识,从CAN控制器初始化开始计时;byTimeFlag :是否使用时间标识,为1时uiTimeStamp有效,byTimeFlag和uiTimeStamp只在此帧为接收帧时有意义;bySendType:发送帧类型,0为正常发送,1为单次发送,2为自发自收,3为单次自发自收只在此帧为发送帧时有意义;byRemoteFlag:是否为远程帧;byExternFlag :是否为扩展帧;byDataNbytes :数据长度(<=8),即Data的长度;byDataBuf:报文的数据;byReserved:系统保留。
typedef struct _VCI_INIT_CONFIG{DWORD dwAccCode;DWORD dwAccMask;DWORD dwReserved;UCHAR ucFilter;UCHAR ucTiming0;UCHAR ucTiming1;UCHAR ucMode;}VCI_INIT_CONFIG ,*PVCI_INIT_CONFIG;成员:dwAccCode :验收码;dwAccMask :屏蔽码;dwReserved:系统保留;ucFilter:滤波方式,1为单波方式,0为双波方式;ucTiming0 :定时器0;ucTimingl :定时器1;ucMode :模式。
0为正常模式,1为只听模式在Datalayer.cpp中添加成员变量:BYTE m_byCANRealTimeBuffer[];BYTE m_byCANParmBuffer[];添加成员函数:int GetDataFromCANPacket();对CAN接收到的数据进行解析分类,将数据存于他对应的地方。
CAN从界面层到通讯层的整体流程图:OpenCAN ()函数流程图:SendCanPacket()流程图:SendCanPacket。
判断iEventCANThread()流程图:通过返回值 判断是否超 时重发请求关闭CANN 发送实时数 据请求报文接收实时数 据报文While 判断是否瓷生其 他事件并且是否为一*..- 组数据的最后一帧'发送故障记 录请求报文接收实时数 据报文通过返回值 判断是否超时重发请求RecvCanPacket ()流程图:1)如收到的是心跳报文;则丢掉2)如收到的是’中止SDO请求报文’(最后4个字节是16进制中止代码之一■——0601 0000,其功能描述是对象不支持访问勺则上位机通知参数设定界面,参数设定界面弹出对话框告知参数INDEX或SUBINDEX出错。
上位机停止上传/下载系统参数。
4实时数据和参数通信过程(供参考)4.1数据结构:在InternalDef.h 中增加#define LIMIT_CAN_RECV_ONE_PACKET_TIMEOUT_MS 200#define PACKET_TIMEOUT 2在PdasConfig中增加Int m_iCanRecvOnePacketTimeoutMs ;在PdasCong.cpp 中m_iCanRecvOnePacketTimeoutMs= LIMIT_CAN_RECV_ONE_PACKET_TIM EOUT_MS在DataLayer.h中增加int m_iCanRealTimeDataNbytes ; //UDP 收到的数据长度BYTE m_byCanRealTimeData[500];在Can.h中增加BYTE m_byRealTimeData[12][8]Int m_iIndexOfRealTimeData;BOOL m_bFirstRealTimeBlock4.2程序伪代码:1.初始化m_byRealTimeData[][]为全0,且m_byRealTimeData[0][0]=0xff ;m_bFirstRealTimeBlock=TRUE2.在应该发送的时刻调用SendNmi (0x01)函数该函数组织报文(00,02,01,02,00,00,00,00,00,00然后调用VCI_Trasmit()3.BOOL bShouldSave=FALSE;While(TRUE){If (ShouldSendParmPacket(...)){ 〃有上载参数报文或修改参数报文要发送OrganizeParmPacket(...) 〃组织发送VCI_Transmit(...)}iNbytes=VCI_Receive(...),超时时间用变量g_PdasConfig.CanRecvOnePacketTimeoutMs;iState=ProcessPossibleTimeOut(...) 〃返回PACKET_TIMEOUT 或DEVICE_FAULTIf(iState==PACKET_TIMEOUT)Continue;Else if(iState==DEVICE_FAULT){g_DataLayer.iDeviceState[DEVICE_CAN]=DEVICE_FAULTBreak;}iPacketType=JudgeReceivedPacketType(...)If (iPacketType==REAL_TIME_DATA||==LAST_REAL_TIME_DATA) 〃收到实时数据报文根据ID , DL, Byte 放入相应m_byRealTimeData[?][] Else if(iPacketType==UPLOAD_PARM )ProcessUpLoadParm(....)〃参数报文处理Else if(iPacketType==MODITY_PARM )ProcessModityParm(...) //参数报文处理If(iPacketType==LAST_REAL_TIME_DATA)//(0x484,0x08,0x0B) 收到{If ( m_iReadRecordStage==BEGN break〃退出循环,去读故障记录数据If(m_bFirstRealTimeBlock==TRUE){If (12个报文全收到){m_bFirstRealTimeBlock=FALSEbShouldSave=TRUE}}Else{bShouldSave=TRUE}}If (bShouldSave){bShouldSave=FALSE;g_DataLayer.PutRealTimeData(m_byRealTimeData ,iErrorCode ,DEVICE_CAN );0x2000 0x3000 (0x3000-1) (0x4000-1)} }//end of While()5传送故障记录数据或运行记录数据过程(供参考) 5.1数据结构: InternalDef.h 中增加 #defineNON_RECORD 0#define FAULT_RECORD 1 #defineNORMAL_RECORD2#define BEGIN_RECORD 1 ... #define COMPLETE_RECORDxx#define FIRST_INDEX_OF_FAULT_RECORD #define FIRST_INDEX_OF_NORMAL_RECORD #define LAST_INDEX_OF_FAULT_RECORD #defineLAST_INDEX_OF_NORMAL_RECORD〃现由周提供PdasConfig.h 中增加 Int m_iFirstIndexOfFaultRecord Intm_iFirstIndexOfNormalRecord Int m_iLastIndexOfFaultRecord Int m_iLastIndexOfNormalRecordPdasConfig.cpp 中增加对它们赋初值Can 类中增加Intm_iRecvRecordTypeInt m_iRecvRecordStageBYTE m_byRecordData[12][8]Int m_iIndexOfRecordData;Int m_iSubIndexOfRecordDataInt m_iBlockSizeOfRecordDataDalaLayer中增加RecvFaultRecord (..)RecvNormalRecord(...)5.2伪代码1.对故障记录数据,界面调用g_DataLayer.RecvFaultRecord().g_DataLayer.RecvFaultRecord()勺工作:-设置变量Can.m_iRecvRecordStage = BEGIN还是设置事件m_EventRecvRecord ???M论-设置Can.m_iRecvRecordType=FAULT_RECORD 对故障记录数据,界面调用g_DataLayer.RecvNormalRecord().g_DataLayer.RecvNormalRecord()勺工作:-设置变量Can.m_iRecvRecordStage = BEGIN_RECORD还是设置事件m_EventRecvRecord ???M论-设置Can.m_iRecvRecordType=NORMAL_RECOED初始化m_byRecordData[12][8]为0 和m_byReacordData[0][0] 为0xFF。