Копирование содержимого буфера разных типов данных - PullRequest
3 голосов
/ 22 марта 2012

Я пишу код для протокола Modbus, который работает на контроллере MSP430.Буфер ответа (глобальный) представляет собой массив 8-битных данных, через который ответ на обработанный запрос должен быть отправлен по последовательному UART.Теперь моя проблема в том, что сгенерированный ответ имеет комбинацию разных типов данных.то есть uint8, uint32, float.Как отправить эти данные с помощью глобального буфера ответов?

Для 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 ]

1 голос
/ 22 марта 2012

простая реализация состояла бы в том, чтобы создать структуру ответа и запомнить структуру ответа в буфере.

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

Примечание: поскольку похоже, что вы работаете над протоколом, порядковый номер может быть уже указан, и вы можетенеобходимо упаковать элементы в соответствии с конкретным типом байтов, и простой memcpy не будет работать, и вам может понадобиться упаковать типы данных.

1 голос
/ 22 марта 2012

С кастингом и назначением. Э.Г.

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

копирует myval в первые 4 байта globalbuf. * ​​1004 *

Остерегайтесь проблем с выравниванием: на вашей платформе может быть незаконным или дорогостоящим присваивать или считывать значения с адресов, которые не являются целыми кратными этого типа. Например, адреса 0,4,8 и т. Д. В порядке места, чтобы положить uint32.

Это предполагает, что ваш globalbuf начинается с хорошего круглого адреса ..

0 голосов
/ 22 марта 2012

Как насчет использования объединения для представления одного и того же диапазона памяти в разных типах данных?

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
...