我的DDS写入器在写入小尺寸数据时工作正常。但是,当我使用DDS编写器发送大型数据时,我在运行时收到此错误。
DDS_OctetsPlugin_serialize:value length cannot be greater than alloc size
PRESWriterHistoryDriver_initializeSample:serialize sample error in topic 'xxxxx' with type 'DDS::Octets' and encapsulationId 1
WriterHistoryMemoryPlugin_addEntryToSession:!initialize sample
WriterHistoryMemoryPlugin_addEntryToSessions:!add entry to first session
WriterHistoryMemoryPlugin_getEntry:!add virtual sample to sessions
WriterHistoryMemoryPlugin_addSample:!get entry
PRESWriterHistoryDriver_addWrite:!add_sample in topic 'xxxxx'
PRESPsWriter_writeInternal:!collator addWrite
terminate called after throwing an instance of 'dds::core::Error'
what():
DDS_OctetsPlugin_serialize:value length cannot be greater than alloc size
PRESWriterHistoryDriver_initializeSample:serialize sample error in topic 'Pandar20P_BB_UdpPacketList' with type 'DDS::Octets' and encapsulationId 1
WriterHistoryMemoryPlugin_addEntryToSession:!initialize sample
WriterHistoryMemoryPlugin_addEntryToSessions:!add entry to first session
WriterHistoryMemoryPlugin_getEntry:!add virtual sample to sessions
WriterHistoryMemoryPlugin_addSample:!get entry
PRESWriterHistoryDriver_addWrite:!add_sample in topic 'xxxxx'
PRESPsWriter_writeInternal:!collator addWrite以下是我的代码:
auto dp = dds::domain::DomainParticipant(1);
auto topic = dds::topic::Topic<dds::core::BytesTopicType>(dp, channelName);
auto qos = dds::core::QosProvider::Default().datawriter_qos();
writer = dds::pub::DataWriter<dds::core::BytesTopicType>(Publisher(dp), topic, qos, &writerListener);
writer.write(data);任何帮助都是非常感谢的。
发布于 2020-11-07 05:14:51
看起来您正在使用RTI的DDS,并且您为主题选择的类型是内置类型之一。Connext用户手册有一节3.2.7 Managing Memory for Built-in Types,它解释了中间件根据预定义的最大长度为数据样本预先分配了内存。默认情况下,对于您正在使用的八位字节类型,这是2048字节,并且您的序列似乎已经超过了这个长度。如手册中所述,您可以通过设置关联的QoS属性来增加该值。具体对于C++接口,您可以在Built-in types部分中找到相关说明。
在该部分的底部,用户手册还解释了在您事先不知道最大大小是多少的情况下应该如何处理。对于这种情况,可以通过将属性dds.builtin_type.*.alloc_size设置为32位有符号整数2,147,483,647的最大值,将内置类型配置为无边界。请注意,这可能会导致动态分配内存,这可能不是我们所希望的。
顺便问一下,您确定要使用BytesTopicType而不是KeyedBytesTopicType吗?在许多情况下,具有标识字节序列的键值是有益的。类型的键控版本允许您通过为它们提供不同的键值来同时维护它们中的几个的值。
https://stackoverflow.com/questions/64709966
复制相似问题