我需要创建一个需要通过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
配置和设置值是手头已知的,由设备文档提供。这个问题与我在here
中提出的问题有关感谢您迄今所做的努力。
答案 0 :(得分:3)
环形缓冲区是解决此类问题的典型解决方案。
我不知道你在使用什么类型的设备,但我只是假设你正在为某种嵌入式设备编写。我们假设有一些中断将数据从环形缓冲区移动到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);
}
};
通常,您不希望缓冲区动态增长。上面的代码有很多改进空间,还有一些库可用于此类事件。
这个特殊的实现也永远不会让你完全填充缓冲区,但结果是代码更简单。我可能不会将这些代码投入生产,但希望这是朝着正确方向迈出的一步。
答案 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));