Я пишу код для протокола Modbus, который работает на контроллере MSP430. Буфер ответа (глобальный) представляет собой массив из 8-битных данных, через который ответ на обработанный запрос должен быть отправлен по последовательному UART. Теперь моя проблема в том, что генерируемый ответ имеет комбинацию разных типов данных. i.e 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;
}
memcpy для большинства случаев использования достаточно эффективен. я бы собрал весь ответ, а затем сделал один memcpy. Использование typecasting * (* globalbuf) = val было бы таким же эффективным и дорогим, как memcpy, и, как упоминалось в blueshift, вы могли столкнуться с проблемами выравнивания. – keety
На MSP430 uint32, как uint16, должен начинаться с четной границы байта - 16-битный процессор обрабатывает uint32 в двух 16-разрядных фрагментах. Вы можете принудительно назначить цель, указанную globalbuf, на границу uint16, определив объединение массивов uint8 и uint16. Компоновщик поместит эту структуру данных в допустимое местоположение uint16. –