3

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

对于浮动,我尝试使用 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; 
} 
4

3 回答 3

1

与铸造和分配。例如

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

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

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

这假设您的 globalbuf 从一个不错的圆形地址开始..

于 2012-03-22T04:27:46.947 回答
1

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

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

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

于 2012-03-22T05:25:51.993 回答
0

考虑使用联合将相同范围的内存表示为不同的数据类型怎么样?

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
于 2012-03-22T07:01:59.203 回答