为流式处理写入字节数组的最有效方法

Most efficient way of writing byte array for streaming

本文关键字:数组 有效 方法 字节数 字节 处理      更新时间:2023-10-16

我需要创建一个字节数组,该数组需要通过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,但我觉得有很多可管理的方法可以为流编写字节数组。建议?

编辑:请对性能提出建议,因为是线程的。

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,其他代码会调用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);
    }
};

通常,您不希望使缓冲区动态增长以用于此类内容。 上面的代码有很大的改进空间,也有可用于此类事情的库。

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

如果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));