目前笔者遇到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 IDThe valid range formessage type IDis from 0 to 65535, inclusive (see CAN bus transport layer specification). The range is segmented as follows:ID rangePurpose[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 cant decodeDsdlCompilerException: ascii codec cant decode byte 0xa3 in position 17: ordinal not in range(128)ascii codec cant decode byte 0xa3 in position 17: ordinal not in range(128)这里说明文件的编码方式不对我自己遇到的问题是文件编码是ISO-8859-9 编码使用nodepad软件改为utf-8 编码后解决。不过不建议大家这样修改最好的方法就是从dsdl文件夹里面拷贝其它的.uavcan文件或文件夹然后自己重命名并把内容改成自己需要的内容这样省的去转码了简单方便。以上说明的3种.uavcan文件不能生成相应的h文件的原因只是目前遇到的一部分其实关于.uavcan文件名称及其内容编写都有一定的规则要求开发时需要仔细研读官方说明文档。