Я пытаюсь скопировать элементы структуры, содержащей смесь целых чисел, символов и массивов символов, в байтовый массив для отправки в последовательную строку. Пока у меня есть
struct msg_on_send
{
char descriptor_msg[5];
int address;
char space;
char cmdmsg[5];
char CR;
char LF;
};
void switch_output_on()
{
int member;
struct msg_on_send SendMsg_on[sizeof member] =
{
};
unsigned char buffer [ sizeof SendMsg_on[0] ];
showbytes(buffer, serialize(buffer, SendMsg_on));
}
/***************************************************************************
* Function: ArrayBuild *
* Purpose: Uses memcopy to transfer the struct members sequentially *
* into an array of char *
* Arguments: *
* Returns: size_t i = a count of the number of bytes in the array *
***************************************************************************/
size_t ArrayBuild(unsigned char *dst, const struct msg_on_send *object)
{
size_t i = 0;
memcpy(&dst[i], &object->descriptor_msg, sizeof object->descriptor_msg);
i += sizeof object->descriptor_msg;
memcpy(&dst[i], &object->address, sizeof object->address);
i += sizeof object->address;
memcpy(&dst[i], &object->space, sizeof object->space);
i += sizeof object->space;
memcpy(&dst[i], &object->cmdmsg, sizeof object->cmdmsg);
i += sizeof object->cmdmsg;
memcpy(&dst[i], &object->CR, sizeof object->CR);
i += sizeof object->CR;
memcpy(&dst[i], &object->LF, sizeof object->LF);
i += sizeof object->LF;
return i;
}
/***********************************************************************
* Function: USARTWrite *
* Purpose: Writes the array data to the USART data register *
* Arguments: void *object = struct member *
* size_t size = size of array remaining *
* Returns: None *
***********************************************************************/
void USARTWrite(const void *object, size_t size)
{
const unsigned char *byte;
for ( byte = object; size--; ++byte )
{
printf("%02X", *byte);
}
putchar('\n');
}
Когда я получил этот код, я не до конца понимаю, как он работает. Я вижу, что memcpy берет каждый элемент структуры и превращает его в последовательный поток, индексированный переменной 'i', но я не знаю, как функция USARTWrite упаковывает это в строку или как загрузить массив с помощью моя структура инициализации.
Извините, этот пост немного длинный, но я только начинаю программировать и пытаюсь разобраться с этой концепцией.
Спасибо
Dave
EDIT:
Ух, много хороших ответов быстро - спасибо, ребята.
slaz: Мне кажется, это логично, я даже не задумывался об этом подходе, так как еще не разбирался в указателях, но начинаю понимать, что они являются неотъемлемой частью C, поэтому я должным образом посмотрим.
Эта строка кода отправляет данные в мой UART. Чем бы я заменил массив, содержащий содержимое сообщения? Похоже, я пропускаю логический шаг здесь, где у меня есть переменная, сообщающая мне, где начинается моя структура и насколько она велика, но нет массива для отправки
USART_SendData(USART1, message_on_contents[array_count]);
Харпер Шелби: Спасибо за это описание, оно намного яснее.
1025 * Rgds *
Dave