Используя следующий код, я пытаюсь преобразовать три значения float в один объект NSData, который затем могу передать через последовательный порт.Как преобразовать float в NSData Bytes
float kP = [[self.kPTextField stringValue] floatValue];
float kI = [[self.kITextField stringValue] floatValue];
float kD = [[self.kDTextField stringValue] floatValue];
float combined[] = {kP, kI, kD};
NSData *dataPackage = [NSData dataWithBytes:&combined length:sizeof(combined)];
[self.serialPort sendData:dataPackage];
Проблема в том, что она не работает очень хорошо. Всякий раз, когда я использую функцию «sizeof()« C », он сообщает мне, что« dataPackage »составляет всего 8 байтов, хотя 3 значения float должны составлять 12 байтов. Я получаю данные с Arduino. Он видит, что байты входят, но они не могут быть разборчивы. Я не думаю, что это проблема на стороне Ардуины (но кто знает?).
Любая помощь будет оценена! Я не майор CS, просто биолог, и я никогда не изучал этот материал формально, поэтому мне жаль, если мой вопрос нелепо. Я провел несколько часов в поисках информации об этой проблеме и не нашел ничего, что помогло.
EDIT: Оказывается, этот код был полностью верным. Я сделал простую ошибку на стороне arduino, используя структуру вместо объединения, чтобы взять байты и преобразовать их обратно в поплавки.
Для тех, кто может быть в подобном затруднительном положении, успешный способ преобразования поплавки из байтов, поступающих из последовательного порта является следующее:
(в верхней части файла реализации)
union {
float pidVals[3];
byte bytes[12];
} pidUnion;
(внутри петли)
if (Serial.available() > 11) {
for (int i = 0; i < 12; i++) {
pidUnion.bytes[i] = Serial.read();
}
}
//Now, you can get access to all three floats of data using pidUnion.pidVals[0], pidUnion.pidVals[1], etc.
Это, вероятно, не лучший или самый надежный способ передачи данных. Механизм исправления ошибок или структура пакета отсутствуют. Но он работает в крайнем случае. Я предполагаю, что вы, вероятно, захотите найти способ создания пакета данных вместе с хеш-байт, чтобы убедиться, что все данные верны с другой стороны, этот код не имеет ничего подобного.
Можете ли вы объяснить более точно что вы ожидаете, и что на самом деле происходит? «они не разборчивы» где? когда? чем? Что такое '[self.serialPort dataPackage],' предназначено? –
Да, Джош, спасибо за ответ! self.serialPort - это объект из сторонней библиотеки ORSSerialPort, которая позволяет легко осуществлять последовательный порт. В принципе, я ожидаю, что объект dataPackage будет иметь размер 12 байт, так как это комбинация трех 4-байтовых поплавков. Но, как ни странно, он всегда остается в 8 байт независимо от того, что я делаю. Когда я отправляю данные по порту, arduino получает некоторые данные, но нечувствителен. В принципе, что-то вроде 124235245 или -352245 или -426246245. Единственное, о чем я могу думать, это то, что NSData как-то не прав, так как это всего 8 байтов. – Nightsd01
вы должны знать, что передача через последовательный порт может изменить порядок байтов и что ваше устройство может даже не использовать тот же двоичный формат, что и ваше устройство ... –