SAE J1939 协议源代码分析(三)-程序应用分析

预备知识

1.熟悉CAN2.0B协议,及相关硬件驱动开发
2.熟悉SAE J1939协议http://blog.csdn.net/xietongxueflyme/article/details/74276702/

接口函数简介

函数名函数描述
J1939_Initialization (BOOL);初始化一些全局变量,向总线声明地址(默认地址)
J1939_DequeueMessage (J1939_MESSAGE *MsgPtr)从接受列队中复制接收消息到传入的内存中(*MsgPtr)
J1939_EnqueueMessage (J1939_MESSAGE *MsgPtr)将传入的消息(*MsgPtr),复制到发送列队中
J1939_Poll (unsigned long ElapsedTime)检查列队(轮询模式),提供小的延时,检查地址竞争
J1939_ISR (void)CAN中断(发送和接受,can错误)函数入口

示例1—轮询模式

备注:接受处理,不是标准的接受处理。这里只是测试接受

void main( void )
{
    can_init();
    J1939_Initialization( TRUE );
    //等待地址超时
    while (J1939_Flags.WaitingForAddressClaimContention)
        J1939_Poll(5);
    //设备确认总线上没有,竞争地址的设备存在
    while (1)
    {
    /***********************发送数据***************************/
        Msg.DataPage                = 0;
        Msg.Priority                = J1939_CONTROL_PRIORITY;
        Msg.DestinationAddress      = OTHER_NODE;
        Msg.DataLength              = 8;
        Msg.PDUFormat               = 0xfe;
        Msg.Data[0]         = 0xFF;
        Msg.Data[1]         = 0xFF;
        Msg.Data[2]         = 0xFF;
        Msg.Data[3]         = 0xFF;
        Msg.Data[4]         = 0xFF;
        Msg.Data[5]         = 0xFF;
        Msg.Data[6]         = 0xFF;
        Msg.Data[7]         = 0xFF; 
        while (J1939_EnqueueMessage( &Msg ) != RC_SUCCESS)
            J1939_Poll(5);
     /***********************处理接受数据*************************/
        while (RXQueueCount > 0)
        {
            J1939_DequeueMessage( &Msg );
            if (Msg.PDUFormat == 0x01)
                //你的功能码;
            else if (Msg.PDUFormat == 0x02)
                //你的功能码;
        }

        J1939_Poll(20);
    }
}

示例2—中断模式


void main()
{
    can_init();
    J1939_Initialization( TRUE );
    //等待地址超时
    while (J1939_Flags.WaitingForAddressClaimContention)
        J1939_Poll(5);
    //设备确认总线上没有,竞争地址的设备存在
    while (1)
    {
        //判断接受列队中,存在多少个接受消息(RXQueueCountwhile (RXQueueCount > 0)
        {
            //读取接受列队中的数据到Msg (出队)
            J1939_DequeueMessage( &Msg );
            /*判断是否是数据请求帧*/
            if (Msg.PDUFormat == J1939_PF_REQUEST)
            {
                //判断参数群是否被本设备支持
                if ((Msg.Data[0] == J1939_PGN0_REQ_ENGINE_SPEED) &&
                     (Msg.Data[1] == J1939_PGN1_REQ_ENGINE_SPEED) &&
                     (Msg.Data[2] == J1939_PGN2_REQ_ENGINE_SPEED))
                {
                    if (某种原因不能响应)
                    {
                        /*********发送不能响应(参考J1939-21)*************/
                        Msg.Priority            = J1939_ACK_PRIORITY;
                        Msg.DataPage            = 0;
                        Msg.PDUFormat           = J1939_PF_ACKNOWLEDGMENT;
                        Msg.DestinationAddress  = Msg.SourceAddress;
                        Msg.DataLength          = 8;
                        Msg.Data[0]         = J1939_NACK_CONTROL_BYTE;
                        Msg.Data[1]         = 0xFF;
                        Msg.Data[2]         = 0xFF;
                        Msg.Data[3]         = 0xFF;
                        Msg.Data[4]         = 0xFF;
                        Msg.Data[5]         = J1939_PGN0_REQ_ENGINE_SPEED;
                        Msg.Data[6]         = J1939_PGN1_REQ_ENGINE_SPEED;
                        Msg.Data[7]         = J1939_PGN2_REQ_ENGINE_SPEED;
                    }
                    else
                    {
                    /*******************上传相关的参数群*****************/
                        Msg.Priority    = J1939_INFO_PRIORITY;
                        Msg.DataPage    = J1939_PGN2_REQ_ENGINE_SPEED & 0x01;
                        Msg.PDUFormat   = J1939_PGN1_REQ_ENGINE_SPEED;
                        Msg.GroupExtension = J1939_PGN0_REQ_ENGINE_SPEED;
                        Msg.DataLength  = 1;
                        Msg.Data[0]     = EngineSpeed;
                    }
                    while (J1939_EnqueueMessage( &Msg ) != RC_SUCCESS);
                }
            }
        }
    }
}
### 回答1: SAE J1939-C协议栈代码是一套用于实现SAE J1939协议的软件代码库。SAE J1939协议是一种用于重型商用车辆和工程机械的通信协议,它定义了一种在车辆之间进行数据交换和通信的标准方法。 SAE J1939-C协议栈代码提供了实现SAE J1939协议所需的全部功能和特性。它可以用于开发车辆ECU(电子控制单元)的软件,使其能够与其他车辆上的ECU进行通信。这种通信可以包括车辆的状态信息,如发动机温度、车速、油压等。此外,协议栈代码还支持更复杂的功能,如控制车辆的操作,如制动系统、转向系统等。 SAE J1939-C协议栈代码可以用于不同的硬件平台和操作系统,包括32位和64位的处理器架构,嵌入式系统和PC平台。它是以C编程语言编写的,因此可以很容易地移植到不同的开发环境中。 在使用SAE J1939-C协议栈代码时,开发人员需要了解SAE J1939协议的相关知识,并根据实际应用的需求对代码进行配置和定制。然后,他们可以使用协议栈代码提供的API(应用程序接口)来发送和接收消息,实现与其他车辆上ECU的通信。 SAE J1939-C协议栈代码是一个强大而灵活的工具,可用于快速开发和部署SAE J1939协议兼容的应用程序。它有效地简化了开发过程,提高了开发效率,并确保了开发的软件具备与其他车辆兼容和互操作的能力。 ### 回答2: SAE J1939-C协议栈代码是用于支持SAE J1939标准的通信协议栈的一套源代码SAE J1939是一种用于商用车辆和重型车辆通信的协议标准,它定义了一种高效和可靠的数据通信方式,使得车辆中的各个控制单元能够相互通信并协调工作。 SAE J1939-C协议栈代码提供了实现SAE J1939协议的基本功能,包括消息传输、节点管理、网络管理等。这些功能的实现是通过一系列的代码模块和函数来完成的,开发人员可以根据需要进行定制和调整。 SAE J1939-C协议栈代码的主要作用是简化SAE J1939标准的实施过程,并提供一个标准化的接口,使得不同车辆控制单元之间的通信更加方便和可靠。通过使用这个协议栈代码,开发人员可以快速构建符合SAE J1939标准的应用程序,同时减少开发周期和开发成本。 SAE J1939-C协议栈代码的设计考虑了效率、稳定性和可扩展性,可以满足不同应用场景的需求。它提供了丰富的API和配置选项,使得开发人员可以根据具体需求进行定制和优化。 总之,SAE J1939-C协议栈代码是一套用于支持SAE J1939标准的通信协议栈的源代码,通过使用这个代码,开发人员可以快速构建符合SAE J1939标准的应用程序,并在商用车辆和重型车辆的通信中实现高效和可靠的数据传输。 ### 回答3: SAE J1939 C协议栈代码是一种用于创建和实现SAE J1939通信协议的软件代码。SAE J1939是一种用于重型商用车辆和柴油发动机之间的通信的协议。该协议定义了一系列数据通信规则,以便不同组件和子系统之间可以进行可靠的信息交换。 SAE J1939 C协议栈代码基于C语言编写,可以在支持C编程语言的硬件设备上运行。它提供了一系列函数和数据结构,以便开发人员可以轻松地构建和扩展SAE J1939协议的功能。这些代码的设计和实现考虑到了SAE J1939的特定要求和规范。 开发人员可以使用SAE J1939 C协议栈代码来实现SAE J1939协议在不同设备之间的通信。代码提供了发送和接收信息的功能,包括定义和解析J1939报文、识别和管理J1939标识符以及设备的状态管理。使用这些代码可以实现可靠的数据通信和互操作性。 SAE J1939 C协议栈代码的优势在于它的可移植性和可扩展性。它可以在不同的硬件平台和操作系统上运行,并且可以根据特定的项目需求进行定制。此外,有许多开源和商业的SAE J1939 C协议栈代码可用,可以加快开发和测试过程。 总之,SAE J1939 C协议栈代码是一种用于实现SAE J1939通信协议的软件代码,它提供了一套功能丰富的函数和数据结构,用于构建和扩展SAE J1939协议的功能。它的可移植性和可扩展性使得它成为开发SAE J1939通信的理想选择。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值