为流式传输编写字节数组的最有效方法

时间:2011-05-19 01:53:12

标签: c++ buffer

我需要创建一个需要通过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

配置和设置值是手头已知的,由设备文档提供。这个问题与我在here

中提出的问题有关

感谢您迄今所做的努力。

2 个答案:

答案 0 :(得分:3)

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

我不知道你在使用什么类型的设备,但我只是假设你正在为某种嵌入式设备编写。我们假设有一些中断将数据从环形缓冲区移动到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);
    }
};

通常,您不希望缓冲区动态增长。上面的代码有很多改进空间,还有一些库可用于此类事件。

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

答案 1 :(得分:0)

如果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));
相关问题