复制不同数据类型的缓冲区内容

时间:2012-03-22 04:08:40

标签: c msp430 modbus

我正在编写一个在MSP430控制器上运行的modbus协议代码。响应缓冲区(全局)是一个8位数据的数组,通过它可以在串行UART上发送对已处理请求的响应。 现在,我的问题是生成的响应具有不同数据类型的组合。即uint8,uint32,float。 如何使用全局响应缓冲区发送此数据?

对于浮动,我尝试使用memcpy,这似乎工作正常。有没有更好更有效的方法?因为帧大小很大(比如20-30字节)。这是我试图做的演示

int main() 
{ unsigned char buff[8]; //Global buffer 

float temp[2]; //temp buffer to store response values 

temp[0] = 0x00ef2212; 

memcpy(buff, temp, 8); 

printf("buff[0]= %u \n buff[1]= %u\n buff[2] = %u\n buff[3]= %u\n", buff[0],buff[1],buff
[2],buff[3]); 

return 0; 
} 

3 个答案:

答案 0 :(得分:1)

进行投射和分配。 E.g。

uint8 *globalbuf;
uint32 myval;
*(uint32*)globalbuf = myval;

将myval复制到globalbuf的前4个字节中。

注意对齐问题:在您的平台上分配或读取不是该类型大小的整数倍的地址的值可能是非法的或昂贵的。例如地址0,4,8等是放置uint32的好地方。

这假设您的globalbuf以一个漂亮的圆形地址开始..

答案 1 :(得分:1)

一个简单的实现是创建响应结构并将响应结构memcpy到缓冲区

struct response {
   uint8 bytedata;
   uint32 intdata;
   float  floatdata;
};
memcpy((void *)uartbuffer,(void *)&response,sizeof(response));

注意:由于看起来您正在使用协议,因此可能已经指定了endianess,您可能需要根据特定的endian类型打包项目,并且简单的memcpy不起作用,您可能需要打包数据类型。

答案 2 :(得分:0)

如何考虑使用union来将相同范围的内存表示为不同的数据类型?

typedef union {
    unsigned char buff[8];
    float temp[2];
} un;

un global_buffer;
// give global_buffer.buff some data.
un local_buffer;

local_buffer = global_buffer; 
// handle local_buffer.temp