Мне нужно отправить поплавки из Simulink в C (встроенный в MCU) через UART.
Я нашел код, который работает для отправки поплавков в противоположном направлении, но мне нужно полностью понять его, чтобы написатькод для получения float.
Это оригинальный код:
unsigned char *chptr;
chptr = (unsigned char *) &floatvalue;
Tx(*chptr++);Tx(*chptr++);Tx(*chptr++);Tx(*chptr);
Это мой измененный код (работает):
float testFloat = 3.1416;
unsigned char *chptr;
chptr = (unsigned char *) &testFloat;
ROM_UARTCharPut(UART0_BASE,*chptr++);
ROM_UARTCharPut(UART0_BASE,*chptr++);
ROM_UARTCharPut(UART0_BASE,*chptr++);
ROM_UARTCharPut(UART0_BASE,*chptr);
Я думаю, что японять суть происходящего, но некоторые вещи, в которых я не уверен:
Объявляется float длиной 4 байта.
float testFloat = 3.1416;
Объявлен указатель длиной 1 байт
unsigned char *chptr;
Адрес с плавающей точкой приводится в указатель.Из-за разницы в битовой длине указателя и символа я предполагаю, что только адрес битов от 0 до 7 с плавающей запятой приведен к указателю (little endianness)
chptr = (unsigned char *) &testFloat;
Следующие четыре строкивот где мое понимание рушится.
ROM_UARTCharPut(UART0_BASE,*chptr++);
ROM_UARTCharPut(UART0_BASE,*chptr++);
ROM_UARTCharPut(UART0_BASE,*chptr++);
ROM_UARTCharPut(UART0_BASE,*chptr);
Я понимаю, что "* chptr" - это значение переменной, на которую указывает указатель.Я также понимаю, что "* chptr ++" увеличивает адрес указателя на следующий байт.Однако порядок не имеет смысла для меня.
Если бы я должен был пометить 4-байтовый float как:
byte4 byte3 byte2 byte1
Мне кажется, что первыйотправка строки отправки * chptr ++ будет отправлять byte2, а не byte1
, следующая строка будет отправлять byte3,
следующая строка будет byte4
, а последняя строка - байтом соседней переменной или byte1.
Однако на принимающей стороне он работает должным образом (Simulink настроен на прием в little-endiann), поэтому мое понимание должно быть неверным.
Спасибо за любые разъяснения.
PS: как только я пойму этот метод, он будет работать для получения поплавков?Или я лаю не на том дереве?
Спасибо