Что состоит в том, чтобы отправить лучший способ float
, double
, и int16
по сериалу на Ардуино?
Serial.print()
только отправляет значения как закодированный ASCII. Но я хочу отправить значения как байты. Serial.write()
принимает байт и bytearrays, но что лучший способ состоит в том, чтобы преобразовать значения в байты?
Я пытался бросить int16
к byte*
, без удачи. Я также использовал memcpy, но это использует для многих циклов ЦП. Ардуино использует плоскость C/C++. Это - микроконтроллер ATmega328.
Да, чтобы отправить эти числа, вы должны сначала преобразовать их в строки 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)
.
В результате преобразования вы получите строку символов с нулевым символом в конце, скорректированную влево (без начальных пробелов и нулей).
Вы можете выполнять преобразование где угодно и как угодно; эти функции просто иллюстрации.
Имеет ли значение размер? Если это так, вы можете кодировать каждую 32-битную группу в 5 символов ASCII, используя ASCII85, см. http://en.wikipedia.org/wiki/Ascii85 .
хм. Как насчет этого:
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));
}