0

Nanopbを使用して、VxWorks ベースの National Instruments 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;
}

プロトファイルは次のとおりです。

syntax = "proto2"

message ExampleMsg {
    required int32 value = 1;
    required int32 number = 2;
    required string name = 3;
}

コールバックを extern "C" にしてみましたが、何も変わりませんでした。また、最大長の nanopb オプション ファイルを追加しようとしましたが、正しく理解できなかったか、機能しませんでした。

proto メッセージから文字列を削除し、コールバックを削除すると、うまく機能します。この 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;
}

更新された proto ファイル:

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

message ExampleMsg {
    required int32 value = 1;
    required int32 number = 2;
    required string name = 3 [(nanopb).max_size = 40];
}
4

2 に答える 2