gpt4 book ai didi

c++ - 为流式写入字节数组的最有效方式

转载 作者:行者123 更新时间:2023-11-30 03:07:03 25 4
gpt4 key购买 nike

我需要创建一个字节数组,需要通过 UART 流式传输到另一个设备。我可以事先填写一些固定参数,但字符串等变量是动态调整大小的。到目前为止,我一直在做:

unsigned char buffer[255];
unsigned char wr_head = 0;
buffer[wr_head++] = 0x01; // and so on
memcpy(&buffer[wr_head], &some_chararray, sizeof(some_chararray));
wr_head += some_chararray;

我已经尝试过其他方法,例如 std::stringstd::vector,但我觉得为流编写字节数组有很多易于管理的方法。有什么建议吗?

edit:由于是线程化的,请对性能提出建议。

edit2:很抱歉第一次缺少细节。该设备确实是一个嵌入式设备。尽管有人提出了一些解决方案,但这并不是我真正想要的。也许我当前实现的一个片段会消除一些困惑:

unsigned char buffer[255];
unsigned char wr_head = 0;

buffer[wr_head++] = 0x01; // Set message type
buffer[wr_head++] = 0x30; // message length
memcpy(&buffer[wr_head], &some_chararray, sizeof(some_chararray));
wr_head += some_chararray;
buffer[wr_head++] = CalChecksum;
UartSend(&buffer, wr_head); // Send array to stream out from UART

配置和设置值事先已知,由设备文档提供。这个问题与我在 here 中提出的问题有关

感谢迄今为止的努力。

最佳答案

环形缓冲区是此类问题的典型解决方案。

我不知道您使用的是哪种设备,但我只是假设您正在为某种嵌入式设备编写代码。让我们假设有一些中断将数据从环形缓冲区移动到 UART。此中断将调用getc,其他代码将调用putcputs

class RingBuffer {
private:
static unsigned BUFSZ = 256;
volatile unsigned char buf[BUFSZ];
volatile unsigned char read, write;

public:
RingBuffer() : read(0), write(0) { }

// Blocks until space is available
void putc(unsigned int c) {
while (((write - read) & (BUFSZ - 1)) == 1)
sleep();
buf[write++ & (BUFSZ - 1)] = c;
}

// Returns -1 if empty
int getc() {
if (read == write)
return -1;
return buf[read++ & (BUFSZ - 1)];
}

// There are faster ways to write this.
void puts(char *str) {
for (; *str; ++str)
putc(*str);
}
};

通常,您不想让缓冲区动态增长这样的事情。上面的代码还有很大的改进空间,也有可用于此类事情的库。

这个特定的实现也永远不会让您完全填充缓冲区,但代码因此更简单。我可能不会将这段代码投入生产,但希望这是朝着正确方向迈出的一步。

关于c++ - 为流式写入字节数组的最有效方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6052969/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com