使用.uavcan文件不能生成相关的h文件问题分享

目前笔者遇到uavcan有以下3种情况不能生成对应的h文件

1. uavcan文件的序号与已经存在的文件序号重复

2. uavcan文件的首字母没有大写

3. uavcan文件的编码方式不对

 

讲述上面3个问题之前,先来看看dsdl是什么东西吧

官方的定义是:

        数据结构描述语言(DSDL)用于定义通过CAN总线进行交换的数据结构。DSDL定义用于为某种编程语言自动生成消息序列化/反序列化代码。从DSDL定义文件生成源代码的工具称为DSDL编译器

     为了简化uavcan消息的开发,uavcan作者专门开发了一个叫dsdlc编译器,就是一个可以自动检查dsdl文件夹里面的文件名称和内容,并且自动生成需要的c++头文件,用户只要关注具体的.uavan 文件内容就可以,不用为该消息自己编写专门的消息编码解码函数和构造类型,作者开发了一套标准C++模板,然后使用python脚本自动生成需要的消息相关文件,简单说就是简化了开发过程也标准化了开发过程。

回到正题:

下面分别对3种情况遇到的dsdlc的编译问题给出试验及说明

1. uavcan文件的序号与已经存在的文件序号重复

比如这里,我们在 libuavcan/dsdl/equipment 的文件夹下先建立一个文件夹叫 mytest

然后在该文件夹下新建一个uavcan文件,文件名称取为 " 1.Mytestfile.uavcan", 文件内容里面就写

uint8    testvalue

注意后面没有分号!!

 

dsdlc编译器错误信息如下:

DsdlCompilerException: Default data type ID collision: [libuavcan/dsdl/uavcan/equipment/mytest/1.Mytestfile.uavcan] [libuavcan/dsdl/uavcan/protocol/dynamic_node_id/1.Allocation.uavcan]

Default data type ID collision: [libuavcan/dsdl/uavcan/equipment/mytest/1.Mytestfile.uavcan] [libuavcan/dsdl/uavcan/protocol/dynamic_node_id/1.Allocation.uavcan]

 

编译zubax_gnss 工程可能没有错误,但是仔细看编译过程会发现 dsdlc编译发生错误,无法产生想要的h文件,原因也提示出来了,就是默认数据类型ID冲突,这里定义的" 1.Mytestfile.uavcan" 文件与 “1.Allocation.uavcan” 文件的ID都是1,所以冲突了,python无法生成您需要的h文件,理由也很简单,因为uavcan通信时需要满足不同的消息其消息ID必须不同!!

查看uavcan官网消息ID的说明:

https://uavcan.org/Specification/5._Application_level_conventions/

Message type ID

The valid range for message type ID is from 0 to 65535, inclusive (see CAN bus transport layer specification). The range is segmented as follows:

ID range Purpose
[0, 20000) Standard message types
[20000, 21000) Vendor-specific message types
[21000, 65536) Reserved for future use

针对用户特定的消息,其消息ID范围最好是:[20000, 21000) 

避免取其它的id范围,以免产生ID冲突

 

2. uavcan文件的首字母没有大写

为了看到第2条编译错误,我们把上面的文件id改为 20000, 首字母不大写,这样我们的文件就变成了 "20000.mytestfile.uavcan"

,然后编译,出现错误提示:

DsdlCompilerException: libuavcan/dsdl/uavcan/equipment/mytest/20000.mytestfile.uavcan: Internal error: libuavcan/dsdl/uavcan/equipment/mytest/20000.mytestfile.uavcan: Invalid type name [uavcan.equipment.mytest.mytestfile]

错误的意思是,内部错误,不可用的数据类型名称,原因是首字母没有大写,改成首字母大写格式“20000.Mytestfile.uavcan”就可以生成了.

使用.uavcan文件不能生成相关的h文件问题分享_第1张图片

 

3.uavcan 文件的编码方式不对

第3种dsdlc编译错误是文件编码错误,如果uavcan文件中有字符是不能识别的,即便是在 # 号注释后面也不可以,因为dsdlc编译时无法读取不能识别的字符,也就无法判断它后面的是否是注释还是消息内容的一部分,所以无法生成h文件,下面是一个错误提示信息: ‘ascii' code can't decode

DsdlCompilerException: 'ascii' codec can't decode byte 0xa3 in position 17: ordinal not in range(128)

'ascii' codec can't decode byte 0xa3 in position 17: ordinal not in range(128)

这里说明文件的编码方式不对,我自己遇到的问题是文件编码是ISO-8859-9 编码,使用nodepad++软件改为utf-8 编码后解决。

不过不建议大家这样修改,最好的方法就是从dsdl文件夹里面拷贝其它的.uavcan文件或文件夹,然后自己重命名,并把内容改成自己需要的内容,这样省的去转码了,简单方便。

以上说明的3种.uavcan文件不能生成相应的h文件的原因只是目前遇到的一部分,其实关于.uavcan文件名称及其内容编写都有一定的规则要求,开发时需要仔细研读官方说明文档。

 

你可能感兴趣的:(UAVCAN开发系列)