Передача вещественного числа от микроконтроллера к ПК
- Сообщения: 61
- Зарегистрирован: Пн окт 03, 2011 09:49:59
Здравствуйте. Я программирую в CodeVision AVR. Нужно передать 32-битную переменную float с микроконтроллера (у меня ATmega48) на ПК. Передача будет по UART, далее через FT232RL к ПК. Чтение COM-порта ПК будет осуществляться моей программой на Delphi. Но как мне передать это вещественное число. Байт вот я понимаю как передать, а число - нет. Я так понимаю, переменная пудет у меня разбиваться на 4 байта, и они по порядку передаваться, но как я их соберу в Delphi, там нету переменной float, есть тоже 32-х битная переменная Single, но она другая по структуре, я это понял из того что у них разные диапазоны значений. Что мне делать? Помогите советом или примером!!!))
- Реклама
Для разбивки флоата можно использовать объединения:
union{
float f;
char c[4];} float_char;
Есть еще вариант через указатели, но его имеет смысл использовать при передачи больших структур.
Со стороны компа на дельфи должна бытьподдержка таких же чисел с одинарной точностью.
В этом году у меня тоже был проект с получением float-ов через UART. Только на приемной стороне был VisualBasic. Я так и не нашел прямого пути чтоб собрать Single из массива байт. Пришлось извращаться через файловую систему(делал запись в файл!). Но этот вопрос до сих пор мне не дает покоя. Может кточто подскажет по бейсику?
union{
float f;
char c[4];} float_char;
Есть еще вариант через указатели, но его имеет смысл использовать при передачи больших структур.
Со стороны компа на дельфи должна бытьподдержка таких же чисел с одинарной точностью.
В этом году у меня тоже был проект с получением float-ов через UART. Только на приемной стороне был VisualBasic. Я так и не нашел прямого пути чтоб собрать Single из массива байт. Пришлось извращаться через файловую систему(делал запись в файл!). Но этот вопрос до сих пор мне не дает покоя. Может кточто подскажет по бейсику?
Если скорость поступления чисел небольшая, то лучше преобразовать число в строку и передавать её, тогда не нужно будет мучаться с соответствием типов.
Если темп передачи достаточно высокий и нужно сэкономить время передачи ( текст будет передаваться в среднем вдвое дольше), то
со стороны МК на C - union, а на дельфи - вариантную запись
по типу
И тогда можно использовать что-то типа
var R: VR;
R.c[0] := ReadFromUart();
...
My_Newvalue := 3.5+R.f;
Если темп передачи достаточно высокий и нужно сэкономить время передачи ( текст будет передаваться в среднем вдвое дольше), то
со стороны МК на C - union, а на дельфи - вариантную запись
по типу
Код: Выделить всё
Type
VR = Record
s: string;
Case byte of { Безымянный селектор }
1: (c: array [0..3] of byte); { или массив типа byte }
2: (f: Single); { или значение типа Single, причем оба значения,
c и f начинаются по одному и тому же адресу }
end;
var R: VR;
R.c[0] := ReadFromUart();
...
My_Newvalue := 3.5+R.f;
In theory, theory and practice are the same. In practice, they're not.
- Сообщения: 61
- Зарегистрирован: Пн окт 03, 2011 09:49:59
Спасибо вам))Tolmi писал(а):Если скорость поступления чисел небольшая, то лучше преобразовать число в строку и передавать её, тогда не нужно будет мучаться с соответствием типов.
Если темп передачи достаточно высокий и нужно сэкономить время передачи ( текст будет передаваться в среднем вдвое дольше), то
со стороны МК на C - union, а на дельфи - вариантную запись
по типуИ тогда можно использовать что-то типаКод: Выделить всё
Type VR = Record s: string; Case byte of { Безымянный селектор } 1: (c: array [0..3] of byte); { или массив типа byte } 2: (f: Single); { или значение типа Single, причем оба значения, c и f начинаются по одному и тому же адресу } end;
var R: VR;
R.c[0] := ReadFromUart();
...
My_Newvalue := 3.5+R.f;

