Передача вещественного числа от микроконтроллера к ПК

Подключаем наши девайсы к компьютеру. Обсуждаются: порты, протоколы, драйвера, языки программирования и т.д.
Ответить
Открыл глаза
Сообщения: 61
Зарегистрирован: Пн окт 03, 2011 09:49:59

Сообщение port_wine777 »

Здравствуйте. Я программирую в CodeVision AVR. Нужно передать 32-битную переменную float с микроконтроллера (у меня ATmega48) на ПК. Передача будет по UART, далее через FT232RL к ПК. Чтение COM-порта ПК будет осуществляться моей программой на Delphi. Но как мне передать это вещественное число. Байт вот я понимаю как передать, а число - нет. Я так понимаю, переменная пудет у меня разбиваться на 4 байта, и они по порядку передаваться, но как я их соберу в Delphi, там нету переменной float, есть тоже 32-х битная переменная Single, но она другая по структуре, я это понял из того что у них разные диапазоны значений. Что мне делать? Помогите советом или примером!!!))
Реклама
Поставщик валерьянки для Кота
Сообщения: 2222
Зарегистрирован: Вт ноя 27, 2007 11:32:06
Откуда: Tashkent

Сообщение uk8amk »

Для разбивки флоата можно использовать объединения:
union{
float f;
char c[4];} float_char;
Есть еще вариант через указатели, но его имеет смысл использовать при передачи больших структур.
Со стороны компа на дельфи должна бытьподдержка таких же чисел с одинарной точностью.
В этом году у меня тоже был проект с получением float-ов через UART. Только на приемной стороне был VisualBasic. Я так и не нашел прямого пути чтоб собрать Single из массива байт. Пришлось извращаться через файловую систему(делал запись в файл!). Но этот вопрос до сих пор мне не дает покоя. Может кточто подскажет по бейсику?
Реклама
Говорящий с текстолитом
Сообщения: 1658
Зарегистрирован: Вс дек 11, 2011 05:25:04
Откуда: Киев, Украина

Сообщение 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;
In theory, theory and practice are the same. In practice, they're not.
Контактная информация:
Открыл глаза
Сообщения: 61
Зарегистрирован: Пн окт 03, 2011 09:49:59

Сообщение port_wine777 »

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;
Спасибо вам))
Реклама
Эиком - электронные компоненты и радиодетали
Ответить

Вернуться в «Интеграция с ПК»