目前笔者遇到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/
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”就可以生成了.
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文件名称及其内容编写都有一定的规则要求,开发时需要仔细研读官方说明文档。