无回调的Nanopb

Chu*_*nch 0 c labview vxworks protocol-buffers nanopb

我正在使用Nanopb尝试从基于VxWorks的National Compact Compact RIO(9025)发送protobuf消息。我的交叉编译效果很好,甚至可以发送不需要额外编码的数据类型的完整消息。让我着迷的是回调。我的代码是通过LabVIEW交叉编译和调用的,基于Nanopb的基于回调的结构似乎在目标计算机上中断(错误,崩溃,目标重新启动等)。如果我不带任何回调地运行它,则效果很好。

这是有问题的代码:

bool encode_string(pb_ostream_t *stream, const pb_field_t *field, void * const *arg)
{
    char *str = "Woo hoo!";

    if (!pb_encode_tag_for_field(stream, field))
        return false;

    return pb_encode_string(stream, (uint8_t*)str, strlen(str));
}

extern "C" uint16_t getPacket(uint8_t* packet)
{
    uint8_t buffer[256];
    uint16_t packetSize;

    ExampleMsg msg = {};
    pb_ostream_t stream = pb_ostream_from_buffer(buffer, sizeof(buffer));

    msg.name.funcs.encode = &encode_string;

    msg.value = 17;
    msg.number = 18;

    pb_encode(&stream, ExampleMsg_fields, &msg);
    packetSize = stream.bytes_written;

    memcpy(packet, buffer, 256);
    return packetSize;
}
Run Code Online (Sandbox Code Playgroud)

这是原始文件:

syntax = "proto2"

message ExampleMsg {
    required int32 value = 1;
    required int32 number = 2;
    required string name = 3;
}
Run Code Online (Sandbox Code Playgroud)

我也尝试将回调设置为外部“ C”,并且它什么都没有改变。我也尝试过添加最大长度的nanopb选项文件,或者它无法正确理解它,或者它也不起作用。

如果我从原始消息中删除字符串并删除回调,则效果很好。在该LabVIEW-> C库环境中,回调结构似乎无法正常工作。没有回调结构,还有其他方法可以编码消息吗?还是以某种方式将回调嵌入到getPacket()函数中?

更新的代码:

extern "C" uint16_t getPacket(uint8_t* packet)
{
    uint8_t buffer[256];
    for (unsigned int i = 0; i < 256; ++i)
        buffer[i] = 0;

    uint16_t packetSize;

    ExampleMsg msg = {};
    pb_ostream_t stream = pb_ostream_from_buffer(buffer, sizeof(buffer));

    msg.name.funcs.encode = &encode_string;

    msg.value = 17;
    msg.number = 18;
    char name[] = "Woo hoo!";
    strncpy(msg.name, name, strlen(name));

    pb_encode(&stream, ExampleMsg_fields, &msg);
    packetSize = stream.bytes_written;

    memcpy(packet, buffer, sizeof(buffer));
    return packetSize;
}
Run Code Online (Sandbox Code Playgroud)

更新的原始文件:

syntax = "proto2"
import "nanopb.proto";   

message ExampleMsg {
    required int32 value = 1;
    required int32 number = 2;
    required string name = 3 [(nanopb).max_size = 40];
}
Run Code Online (Sandbox Code Playgroud)

jpa*_*jpa 5

通过使用(nanopb).max_size = 123.proto文件中的选项为字符串字段提供最大大小,可以避免回调。然后nanopb可以char在结构中生成一个简单的数组(文档的相关部分)。

关于为什么回调不起作用:只是一个猜测,但是请尝试extern "C"也将回调添加到回调函数中。我假设您在那里使用C ++,所以也许在该平台上,C和C ++调用约定不同,这会导致崩溃。

VxWorks串行控制台是否提供有关崩溃的更多信息?我不记得是否对从LabView调用的函数执行此操作,因此直接从VxWorks shell运行一些测试代码也值得尝试。