利用asn1c 工具填充CASE消息集-BSM

15 篇文章 1 订阅
5 篇文章 8 订阅

利用asn1c 工具填充CASE消息集-BSM

  利用asn1c工具填充BSM消息可简单总结如下:
  1、使用asn1c工具将CASE53-2017/2019的asn.1源文件解析成*.h和*.c文件,asn.1源文件下载
  2、新建test.c,包含上一步生成的"MessageFrame.h",填充BSM消息集,最后编码。代码如下:

#include "MessageFrame.h"
#include <sys/time.h>
#include <time.h>

void BSMEncode()
{
    int currentSecMark, i;
    struct timeval tv;
    struct tm* currentTime;
    int BsmCnt = 0;
    int MsgCnt = 0;
    BasicSafetyMessage_t *bsm;
    MessageFrame_t *msgFrame = (MessageFrame_t *)malloc(sizeof(MessageFrame_t));
    memset(msgFrame, 0, sizeof(MessageFrame_t));
    msgFrame->present = MessageFrame_PR_bsmFrame;
    bsm = &msgFrame->choice.bsmFrame;

    bsm->id.buf = (uint8_t *)malloc(8);
    bsm->id.size = 8;
    memcpy(bsm->id.buf ,"12345678", 8);  

    bsm->msgCnt = BsmCnt++;
    BsmCnt %= 128;
    bsm->motionCfd = NULL;
    
    gettimeofday(&tv, NULL);
    currentTime = localtime(&tv.tv_sec);
    currentSecMark = (currentTime->tm_sec * 1000 + tv.tv_usec / 1000);   
    bsm->secMark = currentSecMark;
    bsm->timeConfidence = NULL;


    //填充车身自身信息,值暂时都定为0,后续可从CAN总线上取
    bsm->accelSet.lat = 0;
    bsm->accelSet.Long = 0;
    bsm->accelSet.vert = 0;
    bsm->accelSet.yaw = 0;    
    bsm->angle = NULL;                              //方向盘角度 GB:1.5°, -126~127 127为无效值,左负右正
    bsm->brakes.brakePadel = (BrakePedalStatus_t*)malloc(sizeof(BrakePedalStatus_t));
    *(bsm->brakes.brakePadel) = 0;                  //GB:0->unavailable;1->not pressed;2->pressed
    bsm->brakes.abs = NULL;
    bsm->brakes.auxBrakes = NULL;
    bsm->brakes.brakeBoost = NULL;
    bsm->brakes.scs = NULL;
    bsm->brakes.traction = NULL;
    bsm->brakes.wheelBrakes = NULL;
    bsm->transmission = 0;                          //GB:0->N,1->P,2->D,3->R
    bsm->motionCfd = NULL;

    //填充本车定位相关数据
    bsm->heading = 12000;             //GB:0.0125°
    bsm->pos.lat = 300000000;           //GB:1.0e-7
    bsm->pos.Long =1200000000;          //GB:1.0e-7
    bsm->pos.elevation = (Elevation_t*)malloc(sizeof(Elevation_t));
    *(bsm->pos.elevation) = 210;        //GB:0.1m
    bsm->speed = 100;                 //GB:0.02m/s
    bsm->posAccuracy = NULL;
    bsm->posConfidence = NULL;

    bsm->size.length = 400;                         //GB 1cm
    bsm->size.width = 150;                          //GB 1cm
    bsm->size.height = (VehicleHeight_t*)malloc(sizeof(VehicleHeight_t));
    *(bsm->size.height) = 30;                       //GB 5cm
    bsm->vehicleClass.classification = 10;
    bsm->vehicleClass.fuelType = NULL;

    bsm->safetyExt = NULL;
    bsm->emergencyExt = NULL;

	//xml打印
    xer_fprint(stdout, &asn_DEF_MessageFrame, msgFrame); 
    //===========  对填充数据进行UPER编码并返回编码后的字符串  ==================
    unsigned char *chbuf = (unsigned char *)malloc(260);    
    memset(chbuf, 0, 260);
    int encodeSize = uper_encode_to_new_buffer(&asn_DEF_MessageFrame, 0,msgFrame, (void**)&chbuf);
    if (encodeSize == -1)
    {
        printf("Could not encode bsmFrame \n");
    }
    else
    {
        for ( i = 0; i < encodeSize; i++)
        {
            printf("%02X ", chbuf[i] & 0xff); //发送的编码
        }
    }
}

  需要注意的问题:
  1、对于消息集中可选“optional”的字段,若不填充数据,则将其置为NULL,不然填充失败;若想填充数据,需要先为其申请空间,不然会报段错误。
  2、对于消息集中某些字段的数值,需要注意其定义的大小范围,在填充时其值不能超过最大值,不然虽然能够填充成功,但是编码会失败。

  • 5
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 10
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值