Нужна помощь в понимании указателей (в c), чтобы получить плавающее значение над UART - PullRequest
0 голосов
/ 15 февраля 2019

Мне нужно отправить поплавки из 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: как только я пойму этот метод, он будет работать для получения поплавков?Или я лаю не на том дереве?

Спасибо

1 Ответ

0 голосов
/ 15 февраля 2019

В качестве комментариев к состоянию вопроса вы используете постинкремент.Таким образом, ваш код обращается к значению в данной ячейке памяти, делает с ним то, что ему нужно, и затем перемещает указатель на следующую ячейку памяти, готовый к следующей строке кода.

Если выиспользовал предварительное приращение, тогда вы говорите: «* Мне кажется, что первая отправляющая строка, отправляющая chptr ++ отправит byte2, а не byte1 », будет правдой.Если вы хотите проверить это, запустите код в режиме отладки и измените * chptr ++ на * ++ chptr.

Этот post имеет хорошее объяснение приращения операций.

...