在静态数组

时间:2017-11-29 12:02:08

标签: c buffer

我正在编写一个从UART接口读取数据的应用程序。数据以数据包形式发送。每个数据包都有一个与之关联的通道。我的应用程序将接收到的数据包复用到虚拟通道(线程)中,以便每个通道可以彼此独立工作。当我收到一个数据包时,我必须根据它的内容做一些事情并产生一个响应。响应使用相同的UART接口发回。

发送的数据主要是二进制。当我从UART接口读取数据时,我事先知道数据包的大小,因此我可以预先分配内存,没有问题。

对我来说问题是产生回应。我知道数据包的最大大小,因此我可以在构建响应时创建一个静态缓冲区。如果我使用ASCII字符而不是二进制数据,我可以依靠NULL终止符来确定缓冲区中存储的数据的长度。但是,我正在使用二进制数据,因此使用NULL字节不起作用。相反,我必须保留一个变量,用于存储缓冲区已用完的字节数。我在考虑使用自定义数据类型来存储二进制数据:

typedef struct {
    unsigned char buff[2048];
    size_t buff_used;
} binary_data_t;

处理此问题的标准方法是什么?

2 个答案:

答案 0 :(得分:1)

由于您知道需要保存数据包的字节数,因此只需使用flexible array member

typedef struct
{
    size_t bytes;
    unsigned char data[];
} binary_data_t;

(请注意identifiers ending in _t are reserved by POSIX,你真的不应该使用它们。)

分配和读取数据(假定您从文件描述符中read()):

binary_data_t *p = malloc( sizeof( *p ) + numDataBytes );
p->bytes = numDataBytes;
ssize_t bytes_read = read( uartFD, p->data, numDataBytes );

答案 1 :(得分:0)

这样做的一种方法可能是存储指向数组下一个字节应放置位置的指针。

typedef struct {
    unsigned char buff[2048];
    char*    pData;
} binary_data_t;

// at init
binary_data_t rspMsg;
rspMsg.pData = &rspMsg.buff[0];

// at entering data
*(rspMsg.pData) = data;
rspMsg.pData++;

// at sending data you know the length via
length = rspMsg.pData - &rspMsg.buff[0];

这是解决这个问题的一种方法。 可以通过多种方式完成。

相关问题