Как отправить плавание по сериалу

Что состоит в том, чтобы отправить лучший способ float, double, и int16 по сериалу на Ардуино?

Serial.print() только отправляет значения как закодированный ASCII. Но я хочу отправить значения как байты. Serial.write() принимает байт и bytearrays, но что лучший способ состоит в том, чтобы преобразовать значения в байты?

Я пытался бросить int16 к byte*, без удачи. Я также использовал memcpy, но это использует для многих циклов ЦП. Ардуино использует плоскость C/C++. Это - микроконтроллер ATmega328.

7
задан dsolimano 15 November 2012 в 15:57
поделиться

3 ответа

Да, чтобы отправить эти числа, вы должны сначала преобразовать их в строки ASCII . Если вы работаете с C, sprintf () , IMO, самый удобный способ выполнить это преобразование:

[Добавлено позже: AAAGHH! Я забыл, что для ints / longs входной аргумент функции должен быть беззнаковым. То же самое для строки формата, переданной в sprintf () . Поэтому я изменил это ниже. Извините за мою ужасную оплошность, которую трудно было бы найти. Кроме того, ulong делает его немного более общим.]

char *
int2str( unsigned long num ) {
    static char retnum[21];       // Enough for 20 digits plus NUL from a 64-bit uint.
    sprintf( retnum, "%ul", num );
    return retnum;
}

И аналогично для чисел с плавающей запятой и удвоения. Код, выполняющий преобразование, был известен заранее. Необходимо указать, какой тип объекта он преобразует, чтобы вы могли получить функции char * float2str (float float_num) и char * dbl2str (double dblnum) .

В результате преобразования вы получите строку символов с нулевым символом в конце, скорректированную влево (без начальных пробелов и нулей).

Вы можете выполнять преобразование где угодно и как угодно; эти функции просто иллюстрации.

9
ответ дан 6 December 2019 в 07:24
поделиться

Имеет ли значение размер? Если это так, вы можете кодировать каждую 32-битную группу в 5 символов ASCII, используя ASCII85, см. http://en.wikipedia.org/wiki/Ascii85 .

0
ответ дан 6 December 2019 в 07:24
поделиться

хм. Как насчет этого:

void send_float (float arg)
{
  // get access to the float as a byte-array:
  byte * data = (byte *) &arg; 

  // write the data to the serial
  Serial.write (data, sizeof (arg));
}
10
ответ дан 6 December 2019 в 07:24
поделиться