为流式处理写入字节数组的最有效方法
Most efficient way of writing byte array for streaming
我需要创建一个字节数组,该数组需要通过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::string
和std::vector
,但我觉得有很多可管理的方法可以为流编写字节数组。建议?
编辑:请对性能提出建议,因为是线程的。
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
配置和设置值事先已知,由设备文档提供。这个问题与我在这里提出的问题有关
感谢您到目前为止的努力。
环形缓冲区是此类问题的典型解决方案。
我不知道你在什么样的设备上,但我只是假设你正在为某种嵌入式设备编写。 假设有一些中断将数据从环形缓冲区移动到UART。 这个中断会调用getc
,其他代码会调用putc
和puts
。
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);
}
};
通常,您不希望使缓冲区动态增长以用于此类内容。 上面的代码有很大的改进空间,也有可用于此类事情的库。
此特定实现也永远不会让您完全填充缓冲区,但代码因此更简单。 我可能不会把这段代码投入生产,但希望这是朝着正确方向迈出的一步。
如果UartSend是一个阻塞函数,那么你可以这样做:
void UartSend(byte b) { UartSend(&b, 1); } // sends one byte
UartSend(0x01); // Set message type
UartSend(0x30); // message length
UartSend(some_chararray,sizeof(some_chararray));
相关文章:
- 使用无符号字符数组有效存储内存
- 有效地计算多维数组的累积和?
- 计算数组重复次数的组合的有效算法,加起来达到给定的总和
- C++ 返回指向函数内定义的静态数组的指针是否有效?
- 声明后,gcc 的动态大小数组是否与标准数组有效相同?
- 如何有效地找到数组中三元组和的最小差异?
- 如何在C++中有效地将数字值重新分配给字符数组
- 如何有效地收集给定数组中的重复元素?
- 创建字符串数组的有效方法
- 如何在C++中有效地将数组移动到向量
- 在递归函数中更有效地创建对象和对象数组?C++
- 张量(多维数组)是树前瞻数据的有效存储类型吗?
- 有效地展平结构数组
- cpp 数组 - 分配常量索引有效,而非常量索引不起作用
- 如何在整数数组中有效地存储大量数字?C++
- 有效地从文本文件中读取带有字符串索引的大型二维数组(矩阵)
- 如何有效地使用 std::async 对指针数组执行操作
- 数组有效,而矢量无效。我做错了什么?
- 为什么包含字符串文字的初始化器对初始化“char”数组有效
- 是return*数组;有效的